問題
組み込みの型ユーティリティ`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に割り当て可能な部分が取り除かれるというわけです。