TypeSprict — 泛型
TS
— 泛型
什么是泛型
1.泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。
2.我们不仅要创建一致的定义良好的API,同时也要考虑可重用性。组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。 在像c#和java这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。这样用户就可以以自己的数据类型来使用组件。
ts
函数定义
1 2 3 4
| function getData(value: string): string { return 'str' }
|
当需要同时支持多个数类型的时候 这时怎么解决呢?
1 2 3 4 5
| function getData (value: any):any { return value }
|
泛型的写法
1.我们在函数名后添加了 ,其中 T 用来指代任意输入的类型,在后面的输入 value: T 和输出 Array 中即可使用了。
2.T表示泛型(也可以取其他名字),具体什么类型是调用这个方法的时候决定的
1 2 3 4 5 6 7 8 9 10
| function createArray<T>(length: number, value: T): Array<T> { let result: T[] = []; for (let i = 0; i < length; i++) { result[i] = value; } return result; }
createArray<string>(3, 'x');
|
多个类型参数
1 2 3 4 5 6
| 泛型可以定义多个不同类型参数 function swap<T, U>(tuple: [T, U]): [U, T] { return [tuple[1], tuple[0]]; }
swap<number, string>([7, 'seven']);
|
函数表达式/函数别名/接口 —配合泛型写法
1 2 3 4
| let getArray: <T>(arg: T, times: number) => T[] getArray = (arg: any, times: number) => { return new Array(times).fill(arg) }
|
1 2 3 4
| interface GetArray<T> { (arg: T, times: number): T[], array: T[] }
|
泛型类
1 2 3 4 5 6 7 8 9 10
|
class GenericNumber<T> { zeroValue: T; add: (x: T, y: T) => T; }
let myGenericNumber = new GenericNumber<number>(); myGenericNumber.zeroValue = 0; myGenericNumber.add = function(x, y) { return x + y; };
|
需要注意的是:类有两部分: 静态部分和实例部分。泛型类值的是实例部分的类型,所以类的静态属性不能使用这个泛型类型
案例:比如有最小堆算法,需要同时支持返回数字和字符串两种类型。通过类的泛型来实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class myClass<T> { public list:T[] = []; add (value: T): void { this.list.push(value) } min () : number { var min=arr[0]; list.forEach((value)=>{ if(value<min){ min=value } }) return min } }
var m = new myClass<number>() m.add(2); m.add(3); m.add(5); m.add(5); m.add(7); m.add(8); alert(m.min())
|
泛型约束
1.有时候我们想对泛型传入的参数加以约束,这时候使用泛型约束
2.思路就是让泛型类型去继承接口或者一些类,让在编译过程去检测传入的泛型是具有当前指定的属性
1 2 3 4 5 6 7 8 9 10
| interface Lengthwise { length: number; }
function loggingIdentity<T extends Lengthwise>(arg: T): T { console.log(arg.length); return arg; }
loggingIdentity(7);
|
泛型参数的默认类型
1 2 3 4 5 6 7
| function createArray<T = string>(length: number, value: T): Array<T> { let result: T[] = []; for (let i = 0; i < length; i++) { result[i] = value; } return result; }
|