분배적 조건부 타입이 되기 위한 조건
- T가 유니온 타입이어야 함
- T가 조건부 타입의 제네릭 매개변수로 사용
- T extends P ? A : B 형태
🔍 Examples - Exclude
// Exclude 타입의 실제 정의
type Exclude<T, U> = T extends U ? never : T;
type Example1 = Exclude<string | number | boolean, string>;
//string extends string > (true) never
//number extends string > (false) number
//boolean extends string > (false) boolean
//유니온 타입에서 never는 제거
type NB = never | number | boolean; //number | boolean
// = number | boolean (string 제거됨)
🔍 Examples - SubType 시 유의
type isSubType<T, P> = T extends P ? true : false;
type Test1 = isSubType<(string | number), string>; //boolean
//string, string => true | number, string => false 이므로 true | false
type Test2 = isSubType<string, (string | number)>; //true
🔍 분배를 방지하기
// 대괄호로 분배 방지
type NonDistributive<T, P> = [T] extends [P] ? true : false;
type Test = NonDistributive<(string | number), string>; // false
// 전체 유니온을 한 번에 비교
🔍 Examples - Union Filtering
type FilterStrings<T> = T extends string ? T : never;
type OnlyStrings = FilterStrings<string | number | boolean | "hello">;
// = string | "hello"