Nhảy tới nội dung

NoInfer<T>

NoInfer<T> là utility type để ngăn chặn type inference của T.

Type argument của NoInfer<T>

T

Type argument T nhận kiểu muốn ngăn chặn inference.

Ví dụ sử dụng NoInfer

Trước tiên là ví dụ không sử dụng NoInfer. Định nghĩa function getIndexFromArray sử dụng generics:

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");

Khi đó T bị suy luận là "grape" | "apple" | "banana" | "peach". Tuy nhiên, chúng ta chỉ muốn cho phép các phần tử có trong mảng làm argument thứ 2. Do đó, bằng cách sử dụng NoInfer, có thể ngăn chặn type inference của 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'.

Thông tin liên quan

📄️ Type inference trong khai báo biến

TypeScript có tính năng gọi là type inference (suy luận kiểu). Type inference là tính năng cho phép compiler tự động xác định kiểu. Lập trình viên có thể tận dụng type inference để bỏ qua type annotation, giảm lượng code cần viết.