1.泛型的语法为函数名字后面跟一个<参数名> 比如:T
2.当我们使用这个函数的时候把参数的类型传进去就可以了 (也就是动态类型)
//举例
function num (a:number,b:number) : Array<number> {
return [a ,b];
}
num(1,2)
function str (a:string,b:string) : Array<string> {
return [a ,b];
}
str('t','c')
//动态类型写法:
function add(a:T,b:T):Array<T>{
return [a,b]
}
add<number>(1,2) //也可写成add(1,2)
add<string>('t','c') //也可写成add('t','c')
//两种写法都可以,注释里的写法是因为ts可以自动推算出类型。
//多类型的泛型
function add<T | U>(a:T,b:U):Array<T|U>{
let arr:Array<T|U> = [a,b]
return arr
}
add(1,'t')
add('t',2)
add(1,true)
……
//泛型约束:获取传值的length
interface len{
length:number
}
function getLen<T extends len>(arg:T){
return arg.length
}
getLen([1,2,3])
getLen(123) //error
//keyof 约束类型
//其中使用了TS泛型和泛型约束,利用keyof 分割 T ,T就是传进来的对象,分割完就是联合类型,再用K继承联合类型,k就是传入对象的元素,从而达到约束类型
function test<T, K extends keyof T>(obj: T, key: K) {
return obj[key]
}
let ob = { a: 1, b: 2, c: 3 }
test(ob, 'a')
test(ob, 'd') //ob不存在‘d’所以报错
//泛型类
//声明方法:名称后定义<类型>
//使用时:确定类型new Sub<number>()
class Tc:<T>{
arr:T[] = []
add(a:T):T{
return [a]
}
}
let t = new Tc<number>()
t.arr[1,2,3]//new的时候约束Tc为number,故只能传number类型的值
t.add(123)