infer
という型があります。
どうやって使っていいのかいまいち理解できていないので使える(読める)ようになるため理解を深めたいと思います!
読んだ人がinfer
型を理解して明日からわかることを目指して記事を書きます!
infer
型とは?
条件付の型(Conditional Types)のextends
の中で利用でき、推論される型を抽出できます。
は?って感じですよね…僕も同じ気持ちでした…。
具体例を見ていきます。
infer
型はどのようなものか?
コードの例をサバイバルTypeScriptからコードを借りてきました。
type Flatten<T> = T extends (infer U)[] ? U : never;
上記のコードを分解していきます!
(infer U)[]
T extends
条件 ? U : never;
よってサンプルコードはT型が配列であれば配列の中の型を返し、そうでなければnever
型を返すFlatten<T>
が定義されています!
extends
を利用した「Conditional Types」の中で利用して型の制限をかけるために利用される型のようです!
infer
型の使いどころ
下記の記事に書かれていた表現が一番しっくりきました!
- 何かの型を持つ配列
- 何かの型でfulfillされるPromise
- 何かの型のプロパティ"abc"を持つオブジェクト
の何かの型を取得したい場合に必要なのがinfer
型。
まとめ
infer
型の理解度はいかがでしょうか?
個人的にはかなりスッキリしました!
ただ、本当に使う日は来るのか…とは思いますがライブラリなどの型定義を読む際には役立つのではないかと思っています!
-
infer
型はextends
「Conditional Types」の中で利用する - ある型の中に含まれる型を抽出するために利用できる
おまけ
Type-Challengesをやっていて面白い記述に出会いました。
infer
型を使うとこんなことができるのか…と思ったので共有です!
問題と被ってはいけないので少しだけコードを変えてます。
type test = 'hoge'
type StringToUnion<T extends string> = T extends `${infer F}${infer R}`
? F | R : never;
type Test = StringToUnion<test>
上記の結果はtype Test = "h" | "oge"
になります。
<T extends string>
`${infer F}${infer R}`
type Test = "h" | "oge"
正直全てを理解できてないですが、こんなことができるのか…と覚えておきたいと思いました。