1、介绍
把类型明确的工作推迟到创建对象的或者调用方法的时候才去明确的特殊类型。
2、初识泛型
只能传入数值类型
function print(arg:num):number{ return arg;} 可以传入任意类型
function print(arg:any):any{ return arg;}使用any规定参数类型,但是不能确定函数返回值类型
T:类型变量,可以实现返回值类型与传入参数类型保持一致
function print<T>(arg:T):T{ return arg;}使用方法:
1、传入所有参数,包含类型参数
let res = print<string>("str");// 输出的类型一定是string2、利用类推论--即时编译会根据传入参数自动确定T参数类型
let res = print("str");// 输入参数类型一定是string3、使用泛型变量
使用泛型创建泛型函数时,编译器要求在函数体必须正确使用这个通用类型。
必须把这个参数当做是任意或者所有类型。
1、注意使用T类型变量是存在的错误
function print<T>(arg:T):T{
console.log(arg.length)// 报错,arg是任意类型,当arg是number类型时不存在length属性
} 2、可以这样使用避免报错
function print<T>(arg:T[]):T[]{
console.log(arg.length)// 这是任意类型的数组,存在length属性
}或者写成这样
function print<T>(arg:Array<T>):Array<T>{
console.log(arg.length)// 这是任意类型的数组,存在length属性
}4、泛型类型
1、泛型函数:有一个类型参数在最前面
function print<T>(arg:T):T{ return arg;}2、可以使用不同的类型参数名,只要在数量上和使用方法上能对应的上就可以。
function print<U>(arg:U):U{ return arg;}3、可以使用带有调用签名的对象字面量来定义泛型函数
let myIdentity: {<T>(arg: T): T} = identity;5、泛型类
泛型类使用( <>)括起泛型类型,跟在类名后面。
class GenericNumber<T> {
zeroValue: T;
add: (x: T, y: T) => T;
}
let myGenericNumber = new GenericNumber<number>();6、泛型约束
function print<T>(arg:T):T{
console.log(arg.length)// 报错,arg是任意类型,当arg是number类型时不存在length属性
}
function print<T>(arg:T[]):T[]{
console.log(arg.length)// 这是任意类型的数组,存在length属性
}