더북(TheBook)

타입을 제네릭으로 바꾸었습니다. 검사하려는 타입이 제네릭이면서 유니언이면 분배법칙이 실행됩니다. Result<string | number>Result<string> | Result<number>가 됩니다. 따라서 Key extends string | boolean ? Key[] : never를 거치면 string [] | never가 되고, never는 사라져서 최종적으로 string[] 타입이 됩니다.

다만 boolean에 분배법칙이 적용될 때는 조심해야 합니다.

type Start = string | number | boolean;
type Result<Key> = Key extends string | boolean ? Key[] : never;
let n: Result<Start> = ['hi'];
// let n: string[] | false[] | true[]
n = [true];

string[] | boolean[]이 될 것이라는 예상과 달리 string[] | false[] | true[]가 됩니다. booleantrue | false로 인식하기 때문입니다.

분배법칙이 일어나는 것을 막고 싶을 수도 있습니다. 다음과 같이 'hi' | 3string인지 검사하는 타입을 만들어보겠습니다. 3string이 아니므로 false가 나와야 합니다.

type IsString<T> = T extends string ? true : false;
type Result = IsString<'hi' | 3>;
// type Result = boolean
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.