분산적인 조건부 타입
✅ 선요약
- 조건부 타입에 유니온 타입을 넣으면 각 요소에 대해 조건이 개별로 평가되는 분산 조건부 타입이 작동함.
- 이를 이용해
Exclude, Extract 등 다양한 유틸리티 타입을 직접 구현 가능함.
조건부 타입 복습
type StringNumberSwitch<T> = T extends number ? string : number;
let a: StringNumberSwitch<number>;
let b: StringNumberSwitch<string>;
분산 조건부 타입의 등장
type StringNumberSwitch<T> = T extends number ? string : number;
let c: StringNumberSwitch<number | string>;
❓ 왜 이런 결과가 나옴?
- 조건부 타입의 타입 변수에 Union 타입이 들어가면, 조건이 각 요소별로 분리되어 평가됨.
- 이를 분산 조건부 타입이라 함.
분산 과정:
- 타입 분해:
StringNumberSwitch<number>
StringNumberSwitch<string>
- 결과 결합:
string | number
Exclude 조건부 타입 구현
type Exclude<T, U> = T extends U ? never : T;
type A = Exclude<number | string | boolean, string>;
계산 흐름:
- 타입 분리:
Exclude<number, string>
Exclude<string, string>
Exclude<boolean, string>
- 결과 결합:
number | never | boolean → number | boolean
never는 공집합이므로 Union에서 자동 제거됨
🧠 마지막 요약
- 조건부 타입에 유니온을 전달하면 자동으로 분산 평가됨.
- 이를 활용하면 타입 연산에서 필터링, 매핑 같은 고급 기능을 구현할 수 있음.
Exclude<T, U>는 T에서 U에 해당하는 타입만 제거함.