お題
条件値C
、C
がtruthyである場合の戻り値の型T
、C
がfalsyである場合の戻り値の型F
を受け取るIf
を実装する。条件値C
はtrue
かfalse
のどちらかであることが期待されるが、T
とF
は任意の型を取ることができる。
やりたいこと
type A = If<true, "a", "b">; // => "a"
type B = If<false, "a", "b">; // => "b"
type C = If<boolean, "a", "b">; // => "a" | "b"
解答
type If<C extends boolean, T, F> = C extends true ? T : F;
解説
処理の流れ
-
<C extends boolean, T, F>
C
にはtrue
かfalse
が期待されているので、boolean
に制限する。 -
C extends true ? T : F
Conditonal Typesを使って、C
がtruthyなら、T
、falsyならF
を返す。
なぜbooleanの場合ユニオン型が返されるのか?
type C = If<boolean, "a", "b">; // => "a" | "b"
boolean
型はtrue | false
のユニオン型だから。
Conditional Typesとは...
参考記事
今回の問題