아이템 7에서 type T1 = keyof (IPerson | ILifespan); 가 never인 이유?
360
0
왜 never인지 헷갈려서 계속 생각을 해보니 아래와 같아서 그런거 같습니다.
페이지 41 마지막 부분에서 풀어 설명하듯이 최종적으로 아래와 같이 됩니다.
type K = 'name' & ('birth' | 'death');
인터섹션(교집합)은 '유닛'을 합치는 건데 지금 보면 유닛이 아니라 유닛이 모인 '유니온' 값을 인터섹션 하려고 하니 혼란이 생겨서 never가 되는 거 같습니다.
사실 제 생각에는 name은 필수이고 birth나 death 값이 들어가면 통과한다는 개념으로 이해 되는데...
제가 생각한게 맞는건지 궁금하네요
답변 1
1
type Person = { name: string; }
type Lifespan = { birth: Date; death: Date }
type KeyofPerson = keyof Person; // 'name'
type KeyofLifespan = keyof Lifespan; // 'birth' | 'death'
type KUnion1 = KeyofPerson | KeyofLifespan;
// 'name' | ('birth' | 'death')
// === 'name' | 'birth' | 'death'
type KInter1 = KeyofPerson & KeyofLifespan;
// 'name' & ('birth' | 'death')
// === ('name' & 'birth') | ('name' & 'death')
// === never | never
// === never;
type KUnion2 = keyof (Person | Lifespan);
// Unions의 키값들의 부분집합. 자체로 구성 불가
// keyof( { name: string; } | { birth: Date; } )
// 두 객체에 공통되는 키값이 없으므로 'keyof'로 표현 불가.
// === (keyof Person) & (keyof Lifespan)
// === never;
나름대로 정리를 해보았습니다.
혼란스러운 요소를 줄이는 차원에서 death프로퍼티를 필수로 바꿨습니다 (?를 뺌)
이해가 되실런지 모르겠네요.
저도 뭔가 머리로는 알것 같은데 설명하기엔 애매하네요..
애초에 ['name' 이면서 동시에 'name'이 아닌 다른것] 은 존재하지 않는게 맞겠지요.
즉 'name은 필수'라는 부분은 틀린 것 같아요.
0
답변을 기대하고 쓴 게 아닌데😂
답변 감사합니다
정재님 답글을 보고나니 생각되는게 인터섹션은 오직 객체 타입만을 위한 타입이다라고 생각이 되어지네요 그 외 타입들을 인터섹션 하면 never가 되버리고요
현재 책에서 배운데까지는 그렇게 생각하고 다음 아이템으로 넘어가는 게 제 정신건강에 좋을거 같습니다🤣





