generated at
Distributive Conditional Types
Conditional Types T extends U ? X : Y の内、
T TypeScriptのUnion型の時、簡約時に分配される
例えば、 T が、 A|B|C だとすると、
直感的には、 (A|B|C extends U) ? X : Y になりそうだが、
実際は、 (A extends U ? X : Y) | (B extends U ? X : Y) | (C extends U ? X : Y) になる
検索のためにDistributive Unionもリンクしておくmrsekut


以下のことにも注意





例えば、Exclude<U, E>
Exclude<U, E>はこんな定義だった
ts
type Exclude<T, U> = T extends U ? never : T;
ここで、第1引数、第2引数に下記を使うことを考える
ts
type T1 = 'a' | 'b' | 'c'; type U1 = 'a' | 'b';
分配されることを無視して、そのままExclude<U, E>の定義に代入すると、こうなる
ts
type A = T1 extends U1 ? never : T1; // 'a' | 'b' | 'c'
実際に、Exclude<U, E>を適用した場合は以下なので結果が異なる
ts
type B = Exclude_<T1, U1>; // 'c'
これは、Exclude<U, E>が以下のように分配して簡約されるからである
ts
type B1 = Exclude_<T1, U1>; // T1を代入 type B2 = Exclude_<'a' | 'b' | 'c', U1>; // 分配! type B3 = Exclude_<'a', U1> | Exclude_<'b', U1> | Exclude_<'c', U1>; // 個々で結果が得られる type B4 = never | never | 'c'; // 結果 type B5 = 'c';