泛型的理解和定义
泛型是一种特殊的变量,只用于表示类型而不是值,称之为:类型变量。
当我们定义一个变量不确定类型的时候有两种解决方式:
1、使用any
使用any定义时存在的问题:虽然可以知道传入值的类型但是无法获取函数返回值的类型;使用过多的any失去了ts类型保护的优势,就变成众人口中的anyscript
2、使用泛型 泛型指的是在定义函数/接口/类型时,不预先指定具体的类型,具体什么类型是调用这个方法的时候决定的泛型的定义:可以支持不特定的数据类型 要求传入和返回的参数一致
通俗理解:泛型就是解决类,接口,方法的复用性,和对不特定数据类型的支持
泛型约束
泛型约束即是对泛型的类型进行约束控制,当在函数里使用泛型参数的属性或者方法时,就需要对泛型进行约束。如下所示的student函数可以接受你选择要传递到类型变量的任何类型。但是,在这种情况下,你应该将 value参数可以接受的类型限制为可以对其执行添加操作的一系列类型,而不是接受任何可能的类型。这种情况称为“泛型约束”。
使用接口约束泛型
interface Person {
name:string;
age:number;
}
function stu<T extends Person>(value:T):T {
return value;
}
stu({name:'liangbing'}); //错误写法, "{ name: string; }"类型 中缺少属性 "age",但 "Person" 中需要该属性
stu({ name: "liangbing" , age:'18'}); //错误写法,不能将“string”类型分配给“number”类型
stu({ name: "liangbing" , age:18});