분산적인 조건부 타입 - 조건부 타입

분산적인 조건부 타입

type StringNumberSwitch<T> = T extends number ? string : number;

let a : StringNumberSwitch<number>;
let b : StringNumberSwitch<string>;

// 조건분 타입의 유니언타입을 제네릭에 넣으면 분산적인 조건부 타입이 됨
let c : StringNumberSwitch<number | string>;
// StringNumberSwitch<number> | 
// StringNumberSwitch<string> -> 이런식으로 한번은 이거 한번은 이거 이렇게 유니온타입으로 묶임

// 최종 결과는 let c : string | number 가 됨

let d: StringNumberSwitch<boolean | number | string>;
// 1단계
// StringNumberSwitch<boolean> |
// StringNumberSwitch<number> |
// StringNumberSwitch<string> 

// 2단계
// number |
// string |
// number

// 결과
// number | string

실용적인 예제 (타입 제거 및 추출)

**// 타입 제거 예제 -> string타입만 제거함**
type Exclude<T, U> = T extends U ? never : T;

type A = Exclude<number | string | boolean, string>
// 1단계
// Exclude<number, string> |
// Exclude<string, string> |
// Exclude<boolean, string>

// 2단계
// number |
// never |
// boolean

// 결과
// number | never | boolean 
// -> union 타입에 never가 껴있으면 never가 사라짐(공집합)

// 최종 결과는 number | boolean

**// 타입 추출 예제 -> string타입만 추출함**
type Extract<T, U> = T extends U ? T : never;

type B = Extract<number | string | boolean, string>;