TypeScript - 泛型约束
在 TypeScript 中,泛型(Generic)可以让你编写通用且可复用的函数或类。但有时候你可能希望限制传入泛型的类型,以确保它们符合某些结构,这时候就需要用到 泛型约束(Generic Constraints)。
如果你在没有设置泛型约束的情况下访问泛型对象的某个属 性,TypeScript 编译器会报错,因为它无法确定该属性是否真的存在。
问题示例
在深入学习泛型约束之前,我们先通过一个示例来理解何时需要使用泛型约束。
示例 1:合并对象
function merge<T, U>(obj1: T, obj2: U) {
return { ...obj1, ...obj2 };
}
const mergedObj = merge({ name: 'Sam' }, { age: 30 });
console.log(mergedObj); // 输出:{ name: 'Sam', age: 30 }
如果我们将第二个参数改为布尔值,代码将无法正确执行:
const mergedObj = merge({ name: 'Sam' }, true);
console.log(mergedObj); // 输出:{ name: 'Sam' }
为了确保泛型参数仅接受特定类型的数据,我们可以使用泛型约束。
泛型约束的工作原理
泛型约束允许你限制泛型参数,使其仅接受特定类型的数据。语法如下:
function merge<T extends object>(obj1: T) {
// 函数体
}
T
是泛型类型。extends
是关键字。object
是数据类型。
示例:限制泛型参数为对象
function merge<T extends object, U extends object>(obj1: T, obj2: U) {
return { ...obj1, ...obj2 };
}
const mergedObj = merge({ name: 'Sam' }, true);
// 错误:'boolean' 类型的参数不能分配给 'object' 类型的参数。