챌린지

내장타입인 Exclude<T, U>를 구현해보세요. T에 있는 타입 중 U에 할당 가능한 타입들을 제거해야 합니다.

예시:

type T0 = Exclude<"a" | "b" | "c", "a">; // expected "b" | "c"
type T1 = Exclude<"a" | "b" | "c", "a" | "b">; // expected "c"

해답

이 문제의 핵심은 Typescript에서 조건부 타입이 분산됨을 아는 것입니다.

T가 유니온일 때 T extends U와 같은 구조를 사용하면, Typescript는 유니온 T를 순회하면서 각 원소들을 주어진 조건에 적용합니다.

따라서 이번 해답은 매우 간단합니다. TU에 할당될 수 있는지 검사하고 할당가 능하다면 그 원소를 생략합니다.

type MyExclude<T, U> = T extends U ? never : T;

참고