3.2 Exclude, Extract, Omit, NonNullable
2.15.1절에서 컨디셔널 타입일 때 유니언인 기존 타입과 제네릭이 만나면 분배법칙이 실행된다고 배웠습니다. 이 절에서 배우는 타입은 모두 분배법칙을 활용하는 타입입니다.
먼저 어떠한 타입에서 지정한 타입을 제거하는 Exclude 타입을 만들어보겠습니다.
type MyExclude<T, U> = T extends U ? never : T;
type Result = MyExclude<1 | '2' | 3, string>;
// type Result = 1 | 3
2.22절과 같은 이유로 타입 이름 앞에 My를 붙였습니다. My를 붙이지 않으면 lib.es5.d.ts의 선언과 중복되기 때문입니다.
1 | '2' | 3은 유니언이므로 분배법칙이 실행됩니다. MyExclude<1 | '2' | 3, string>은 MyExclude<1, string> | MyExclude<'2', string> | MyExclude<3, string>이 되고, 다시 (1 extends string ? never : 1) | ('2' extends string ? never : '2') | (3 extends string ? never : 3)이 되어 1 | never | 3이 됩니다. 그래서 Result는 1 | 3이 됩니다.