問題
組み込みの型ユーティリティ`Exclude <T, U>`を使用せず、`U`に割り当て可能な型を`T`から除外する型を実装します。
例えば:
```ts
type Result = MyExclude<'a' | 'b' | 'c', 'a'> // 'b' | 'c'
```
回答
type MyExclude<T, U> = T extends U ? never : T;
ちょっと解説
-
条件型
T extends U ? X : Y
という形式で書かれ、T
がU
に割り当て可能であればX
を、そうでなければY
を返します。 -
type MyExclude<T, U> = T extends U ? never : T;
この場合では、T
の各要素がU
に割り当て可能かどうかをチェックしています。
T
の要素がU
に割り当て可能なら、その要素はnever
に置き換えられます。
never
はユニオン型から除外されるため、結果U
に割り当て可能な部分が取り除かれるというわけです。