분산적인 조건부 타입 - 조건부 타입
분산적인 조건부 타입
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>;