- A+
所属分类:Web前端
一、泛型函数
- 用法
1 function identity<T>(arg: T): T { 2 return arg; 3 } 4 let output = identity<string>("myString");
- 类型推断,就是说可以不传 T,它会自己推断
let output = identity("myString"); // T 被推断为 string 类型
- T 类型换成 T 类型的数组
1 function loggingIdentity<T>(arg: T[]): T[] { 2 console.log(arg.length); 3 return arg; 4 }
- T 类型的数组用泛型定义
1 function loggingIdentity<T>(arg: Array<T>): Array<T> { 2 console.log(arg.length); 3 return arg; 4 }
二、泛型约束
- 用法
1 interface Lengthwise { 2 length: number; 3 } 4 5 function loggingIdentity<T extends Lengthwise>(arg: T): T { 6 console.log(arg.length); 7 return arg; 8 } 9 10 loggingIdentity({length: 10, value: 3}); // ok 11 loggingIdentity(3); // Error, number doesn't have a .length property
三、泛型约束与类型收窄的区别
- 泛型约束是限制泛型本身,它是从接口层面做限制,未来无论确定为哪一种具体类型,都会受到这种限制
- 类型收窄是限制 unknow 类型的子类型,它限制的是具体类型
- 所以,泛型约束是从抽象层做限制,类型收窄是从实现层做限制
四、泛型接口
- 泛型函数接口
1 interface GenericIdentityFn { 2 <T>(arg: T): T; 3 } 4 5 function identity<T>(arg: T): T { 6 return arg; 7 } 8 9 let myIdentity: GenericIdentityFn = identity;
- 泛型对象接口
1 interface GenericIdentityFn<T> { 2 (arg: T): T; 3 } 4 5 function identity<T>(arg: T): T { 6 return arg; 7 } 8 9 let myIdentity: GenericIdentityFn<number> = identity;
五、泛型类
- 用法
1 class GenericNumber<T> { 2 zeroValue: T; 3 add: (x: T, y: T) => T; 4 } 5 6 let myGenericNumber = new GenericNumber<number>(); 7 myGenericNumber.zeroValue = 0; 8 myGenericNumber.add = function(x, y) { return x + y; };
六、结尾
泛型是一个非常重要的类型,这意味着,组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为我们提供了十分灵活的功能