타입을 넘겨받고 해당 Optional하게 바꾸기
/** `T`의 모든 속성을 순회하며 optional로 수정 */
export type DeepPartial<T> = {
[P in keyof T]?: DeepPartial<T[P]>;
};
/** 특정 key를 제외하고 optional로 변환 */
export type PartialExcept<T, K extends keyof T> = Partial<T> & Pick<T, K>;
/** 특정 key를 제외하고 모든 속성을 optional로 변환 */
export type DeepPartialExcept<T, K extends keyof T> = DeepPartial<T> & Pick<T, K>;
/** 특정 key만 optional로 변환 */
export type PartialKeys<T, K extends keyof T> = Partial<Pick<T, Extract<keyof T, K>>> & Omit<T, K> extends infer O
? { [P in keyof O]: O[P] }
: never;