'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 }만 남게 됩니다.