분배적 조건부 타입이 되기 위한 조건

  1. T가 유니온 타입이어야 함
  2. T가 조건부 타입의 제네릭 매개변수로 사용
  3. 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"