NoInfer<T>
NoInfer<T>
は、T
の型推論を防ぐためのユーティリティ型です。
NoInfer<T>の型引数
T
型引数T
には推論を防ぎたい型を代入します。
NoInferの使用例
まずはNoInferを使用しなかった場合の例です。ジェネリクスを使ってgetIndexFromArray
という関数を定義します
ts
function getIndexFromArray<T extends string>(elements: T[], item: T): number {return elements.findIndex((element) => element === item);}type Fruit = "grape" | "apple" | "banana";const fruits: Fruit[] = ["grape", "apple", "banana"];getIndexFromArray(fruits, "apple");getIndexFromArray(fruits, "peach");
ts
function getIndexFromArray<T extends string>(elements: T[], item: T): number {return elements.findIndex((element) => element === item);}type Fruit = "grape" | "apple" | "banana";const fruits: Fruit[] = ["grape", "apple", "banana"];getIndexFromArray(fruits, "apple");getIndexFromArray(fruits, "peach");
このときT
は"grape" | "apple" | "banana" | "peach"
と推論されてしまいます。しかし第二引数には配列に含まれている要素のみを許容したいです。そこでNoInfer
を利用することによりT
の型推論を防ぐことができます。
ts
functiongetIndexFromArray <T extends string>(elements :T [],item :NoInfer <T >): number {returnelements .findIndex ((element ) =>element ===item );}typeFruit = "grape" | "apple" | "banana";constfruits :Fruit [] = ["grape", "apple", "banana"];getIndexFromArray (fruits , "apple");Argument of type '"peach"' is not assignable to parameter of type 'Fruit'.2345Argument of type '"peach"' is not assignable to parameter of type 'Fruit'.getIndexFromArray (fruits ,"peach" );
ts
functiongetIndexFromArray <T extends string>(elements :T [],item :NoInfer <T >): number {returnelements .findIndex ((element ) =>element ===item );}typeFruit = "grape" | "apple" | "banana";constfruits :Fruit [] = ["grape", "apple", "banana"];getIndexFromArray (fruits , "apple");Argument of type '"peach"' is not assignable to parameter of type 'Fruit'.2345Argument of type '"peach"' is not assignable to parameter of type 'Fruit'.getIndexFromArray (fruits ,"peach" );
関連情報
📄️ 変数宣言の型推論
TypeScriptには型推論(type inference)と呼ばれる機能があります。型推論は、コンパイラが型を自動で判別する機能です。プログラマーは型推論を活用すると、型注釈を省略できるので、コードの記述量を減らせる利点があります。