泛型类
泛型可以约束类的成员
下面定义一个泛型类
class Log<T> {
run(value: T) {
console.log(value);
return value;
}
}
// 传参
let log1 = new Log<number>();
log1.run(1);
// 不传参
let log2 = new Log();
log2.run("1");
静态成员不能引用类类型参数。
class Log<T> {
static run(value: T) {
// 会提示报错
console.log(value);
return value;
}
}
泛型约束
改造一个上一节说的 log 函数,让其打印出参数的 length 属性,这个时候就会提示我们类型 T
上不存在属性 length。
function log<T>(value: T): T {
console.log(value, value.length); // value.length 就会报错提示:类型 `T` 上不存在属性 length
return value;
}
这时我们需要用到泛型约束这个概念,我们先定义一个接口,然后让 T
类型去继承这个接口
interface Length {
length: number;
}
function log<T extends Length>(value: T): T {
console.log(value, value.length);
return value;
}
// 输入的参数有 length 属性
log([1, 2]);
log('123');
log({
length: 1});
泛型的好处
- 函数和类可以轻松地支持多种类型,增强程序的扩展性
- 不必写多条重载函数,冗长的函数签名,增强代码可读性
- 灵活地控制类型之间的约束