このサイトで Type Challenges の洗礼を受けてきました。初級編のクリアにあたって必要だった知識を公開していこうと思います。
型の定義のしかた
type Hoge<T: Fuga> = いろいろな定義
まず、Type Challenges における型定義はだいたいジェネリクスを用いることになります。左辺のジェネリクスで定義した型を右辺でこねくり回すイメージです。
extends
T extends U
$T$ が $U$ に代入可能であることを表します。
ジェネリクスの制約としての文脈ならば、$T$ は $U$ の性質を満たすと言い換えられそうです。
type Hoge<T extends any[]> = いろいろな定義
例えば上のような extends
の使い方をすれば、$T$ が配列であることを強制できます。
また、Conditional Types ではもっぱら条件分岐の条件式として扱われます。
T extends U ? X : Y
$T$ が $U$ に代入可能なら $X$、それいがいなら $Y$ になる型です。
infer
type PromiseUnwrap<T extends Promise<any>> = T extends Promise<infer U> ? U : never
実際にジェネリクスに型を突っ込んだときに評価されて出てくる型を扱うのが infer
です。
Promise
型の何か $T$ を突っ込み、実行時に中身の U
を評価します。
型推論と呼ばれる機能なのですが、推論ですから、評価の対象が必要なキーワードです。上の定義のように extends
での代入で型を抽出するのに使うことができます。
おわり
難しすぎ!