泛型
大约 1 分钟
泛型
泛型语法简介
泛型的语法为 <T>
,其中 T 表示传入的类型
注意:通常使用单个字母来命名泛型类型。这不是语法规则,我们也可以像 TypeScript 中的任何其他类型一样命名泛型,但这种约定有助于向阅读代码的人传达泛型类型不需要特定类型。
function identity<T>(arg: T): T {
return arg;
}
用 <string>
定义了传入类型,让 TypeScript 标识函数的泛型类型参数 T 为 string 类型。 这将强制 string 类型作为参数和返回值的类型。
const foo = identity<string>("foo");
在大部分情况下,程序无需显示指定类型参数的实际类型,会自动推断出类型参数
const foo = identity("foo");
默认类型参数
如果不打算为泛型函数的每次调用添加特定的类型,则可以为泛型类型参数添加默认类型。通过在泛型类型参数后面添加 = DefaultType 来完成:
async function fetchApi<ResultType = Record<string, any>>(
path: string
): Promise<ResultType> {
const response = await fetch(`https://example.com/api${path}`);
return response.json();
}
const data = await fetchApi("/users");
console.log(data.a);
类型参数约束
<TypeParamter extends ConstraintType>
interface Point {
x: number;
y: number;
}
function identity<T extends Point>(x: T): T {
return x;
}
identity({ x: 0, y: 0, z: 0 }); //参数属于Point类型的子类型,能赋值给Point类型
identity({ x: 0 }); // 编译错误
可同时指定泛型约束和默认类型
<T extends ConstraintType = DefaultType>
常见的错误:返回约束类型
function f<T extends boolean>(x: T): T {
return true;
}
f<false>(false);