Template Literal Typesとinferの理解
そういえばTypeScriptに文字列から型を作れるやつあったな...と思ってTemplate Literal Types使ってみた
"/hoge/<fuga>"みたいな動的なパスからパスパラメータの型{ fuga: string }を作りたい
結果、出来た
https://pbs.twimg.com/media/Epa8ZJIUcAAYmgS.png
とりあえず動いた時の画像(型名などは変えた)
PathParams<PathString>にパス文字列を渡すと、それに応じた型になっている
Template Literal Typesは文字列型をあれこれして別の文字列型が作れるというやつ
inferと組み合わせるとさらにいろんな型が作れる
inferはA extends {infer B を含む型} ? B : Cのように使える
inferで指定した型が?の後ろで使えるようになる
inferは「推測する」という意味
Template Literal Typesではtype PathKey<PathItem> = PathItem extends \`<${infer Key}>\` ? Key : never;のようにテンプレート文字列に差し込んで使う
PathKeyに渡された型引数のPathItemが、正規表現で言えば\<(.+)\>にマッチする文字列であれば\1の文字列を示すKey型、そうでなければnever型を返すようになっている
正規表現で出来そうなことはおそらくだいたい出来そうな感じ(頑張れば)
さまざまなA extends B
クラスclass A extends B ... 言うまでもなく継承
ジェネリクスの型引数C<A extends B> ... 型引数の制限
型演算の三項演算子A extends B ? C : D ... 継承関係なら真を返す
ただしどれもAはBを継承しているという意味ではある