首页 > 编程笔记 > JavaScript笔记 阅读:15

TypeScript泛型约束的用法(附带实例)

TypeScript 中的泛型是没有属性和方法声明的,如果直接读取一个泛型变量的某个属性,程序就会报错,因为这个泛型变量根本就不知道它有这个属性。

比如下面的代码读取了一个泛型变量的 length 属性,程序就会报错:
function fn<T>(x: T): void {
    console.log(x.length); // error
}
上面代码出现的问题可以使用泛型约束来解决。

所谓泛型约束,是指在定义泛型时,指定其继承特定接口。这样泛型就能从父接口中继承特定属性或方法了。

重写上面的代码,定义包含 length 属性的接口 Lengthable,在函数 fn2 定义泛型 T 时,指定 T 继承 Lengthable 接口,这样具有 T 类型的 x 变量就有了 length 属性,类型检查就可以正常通过,代码如下:
// 定义包含 length 属性的接口
interface Lengthable {
    length: number;
}

// 指定泛型约束
function fn2<T extends Lengthable>(x: T): void {
    console.log(x.length);
}
在调用函数 fn2 时,需要传入符合约束类型的值,并且该值必须包含 length 属性:
fn2('abc');       // 正确,字符串有 length 属性
//fn2(123);       // 错误,number 类型的值不包含 length 属性

相关文章