더북(TheBook)

'd'T 객체의 속성 이름이 아니기 때문인데요. 만약 'a' | 'c' | 'd' 중에서 'd'처럼 객체의 속성이 아닌 경우는 무시하고, 나머지 'a' | 'c' 속성만 추리려면 어떻게 해야 할까요?

type MyPick<T, K> = {
  [P in (K extends keyof T ? K : never)]: T[P];
};

type Result = MyPick<{ a: string, b: number, c: number }, 'a' | 'c' | 'd'>;

매핑된 객체 타입과 컨디셔널 타입을 같이 사용하면 됩니다. 'a' | 'c' | 'd'는 제네릭(K)이자 유니언이므로 분배법칙이 실행됩니다.

{ a: string, b: number, c: number }T라고 할 때, 'a' extends keyof T ? 'a' : never | 'c' extends keyof T ? 'c' : never | 'd' extends keyof T ? 'd' : never가 실행되고, MyPick<T, K>{ [P in 'a' | 'c' | never]: T[P] }가 됩니다. 최종적으로 { [P in 'a' | 'c']: T[P] }가 되어 { a: string, c: number }만 남게 됩니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.