メインコンテンツまでスキップ

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
function getIndexFromArray<T extends string>(
elements: T[],
item: NoInfer<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");
Argument of type '"peach"' is not assignable to parameter of type 'Fruit'.2345Argument of type '"peach"' is not assignable to parameter of type 'Fruit'.
ts
function getIndexFromArray<T extends string>(
elements: T[],
item: NoInfer<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");
Argument of type '"peach"' is not assignable to parameter of type 'Fruit'.2345Argument of type '"peach"' is not assignable to parameter of type 'Fruit'.

関連情報

📄️ 変数宣言の型推論

TypeScriptには型推論(type inference)と呼ばれる機能があります。型推論は、コンパイラが型を自動で判別する機能です。プログラマーは型推論を活用すると、型注釈を省略できるので、コードの記述量を減らせる利点があります。