Open3
TSで型パラメータにユニオン型を取るジェネリクスを作る時に、ユニオンをいい感じにする (Distributive Conditional Type)
例えば、下記のようなToArray
型を作ったとする。
type ToArray<T> = T[];
この型に対し、ToArray<string | number>
とすると、
(string | number)[]
と解釈されてしまう。
string[] | number[]
にしたいときはどうするのか?
つまり、ToArrayを、型パラメータのUnionに対し、分配的に適用するにはどうすればいいか?
type ToArray<Type> = Type extends any ? Type[] : never;
のように、一見無意味に見えるconditional typeを挟むことによって、ToArray<string | number>
が
string[] | number[]
と解釈される。この振る舞いを指して、When conditional types act on a generic type, they become distributive when given a union type. と説明がされている