mosya<TC> - 条件に当てはまる場合とそうでない場合で切り替える型を作ろうの解説
この記事はmosya<TC>の問題の一つであるIf型の解説になります。
問題
If型を実装します。この型は、Tがtrueの場合はUを、falseの場合はVを返します。
例えば以下のようなコードを満たすようにIf型を実装しましょう。
type A = If<true, "a", "b">; // expected to be 'a'
type B = If<false, "a", "b">; // expected to be 'b'
前提知識
この問題を解くにあたって型についての以下の知識を理解しておく必要があります。
- ジェネリクスを理解する
- Conditional Typesを理解する
ジェネリクスを理解する
まず、<T>というのは、ジェネリクスと呼ばれる機能です。ジェネリクスは、型をパラメータとして受け取ることができる機能です。
この受け取った値を使って、新しい型を生成することができます。
受け取った型を活用して、新しい型を生成することができるので、型の再利用性が高くなります。
例えば、以下のような型が考えられます
type Foo<T> = {
bar: T;
};
この型は、Tという型を受け取り、barというプロパティにTを代入する型です。
この型を使うと、以下のように型を指定することができます。
type FooString = Foo<string>; // { bar: string }
type FooNumber = Foo<number>; // { bar: number }
このようにジェネリクスは型を引数として受け取って、新しい型を生成することができます。
型の制約
Tはextendsをつけることで制約をつけることができます。
例えば、T extends stringとすると、Tはstring型かstring型を継承した型に制約されます。
Conditional Typesを理解する
Conditional Typesは、条件によって型を変更することができる機能です。
例えば、以下のような型が考えられます。
type Foo<T> = T extends string
? string
: number;
この型は、Tがstring型を継承している場合はstring型を、そうでない場合はnumber型を返します。
この型を使うと、以下のように型を指定することができます。
type FooString = Foo<string>; // string
type FooNumber = Foo<boolean>; // number
このようにConditional Typesは、条件によって型を変更することができます。
解答例
以上の前提知識を踏まえて、以下のように解答することができます。
type If<
C extends boolean,
T,
F
> = C extends true ? T : F;
Cはtrueもしくはfalseのどちらかの型に制約させたいので、extends booleanとします。
そしてConditional Typesを使って、Cがtrueの場合はTを、falseの場合はFを返すようにします。
Authored by

Godai@steelydylan
Webサービスを作るのが好きなWebエンジニア。子供が産まれたことをきっかけに独立し法人化。サービス開発が大好き。
好きな言語はTypeScript。
Related









