一. 泛型是什么
泛型就是用一个东西表示“广泛”的类型。
举例如下:returnIt函数的作用是给什么返回什么
1 2 3 4 5 6
| function returnIt<T>(arg: T): T{ return arg; }
let s = returnIt<string>('hi')
|
如果用any来写的话,无法确保参数类型和返回值类型相同
二. 泛型的使用
泛型数组
1 2 3 4 5 6 7 8
| function returnIt<T>(array:T[]):T[]{ return array.concat(array); }
returnIt([1,2,3])
returnIt<number>([1,2,3])
|
泛型接口
1 2 3 4 5 6 7 8 9 10
| interface Addany<T>{ (a:T,b:T):T }
let stringAdd:Addany<string> = function(a:string,b:string):string{ return a+b; } let numberAdd:Addany<number> = function(a:number,b:number):number{ return a+b; }
|
泛型类
1 2 3 4 5 6 7 8 9 10
| class GenericNumber<T>{ zeroValue : T; add : (x:T,y:T)=>T }
let myGeneric = new GenericNumber<number>() myGeneric.zeroValue = 0; myGeneric.add = function(a:number, b:number){ return a+b }
|
泛型函数加类
1 2 3 4 5 6 7 8 9 10
| class Human{ }
function create<T>(c:{new ():T}){ return new c() }
let s = create<Human>(Human)
|
二. 泛型约束是什么
就是给泛型添加一些约束,使其可以拓展一些方法;
因为我们有时候对泛型传过来的值是有一定要求的,所以要添加一些约束
1 2 3 4 5
| function returnIt<T>(arg: T): T{ console.log(arg.length) return arg; }
|
添加约束之后
1 2 3 4 5 6 7 8 9
| interface HasLength{ length: number }
function returnIt<T extends HasLength>(arg: T): T{ console.log(arg.length) return arg; }
|
下例说明添加泛型约束以后,所传参数就必须有length和name属性了;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| interface HasLength{ length: number; name : string }
function returnIt<T extends HasLength>(arg: T): T{ console.log(arg.length) return arg; }
returnIt({ length : 1, name : '123' })
|