어떤 규칙으로 결괏값이 나오는 것인지 헷갈릴 수 있는데, 반환값의 타입이 매개변수의 타입의 부분집합인 경우에만 그 둘의 교집합이 됩니다. 그 외의 경우는 모두 never가 됩니다. 즉, 1 | 2는 1 | 2 | 3의 부분집합이므로 둘의 교집합인 1 | 2가 되고, 1 | 2는 2 | 3의 부분집합이 아니므로 never가 되는 것입니다.
매개변수에 같은 타입 변수를 선언하면 인터섹션이 된다는 사실을 바탕으로 유니언을 인터섹션으로 만드는 타입을 작성할 수 있습니다.
type UnionToIntersection<U>
= (U extends any ? (p: U) => void : never) extends (p: infer I) => void
? I
: never;
type Result5 = UnionToIntersection<{ a: number } | { b: string }>;
/*
type Result5 = {
a: number;
} & {
b: string;
}
*/
type Result6 = UnionToIntersection<boolean | true>;
// type Result6 = never