泛型
泛型:软件工程中,我们不仅要创建一致的定义良好的API,
同时也要考虑可重用性。 组件不仅能够支持当前的数据类型,
同时也能支持未来的数据类型,
这在创建大型系统时为你提供了十分灵活的功能。
在像C#和Java这样的语言中,
可以使用泛型来创建可重用的组件,
一个组件可以支持多种类型的数据。
样用户就可以以自己的数据类型来使用组件。
通俗理解:泛型就是解决 类 接口 方法的复用性、
以及对不特定数据类型的支持(类型校验)
引例
同时返回 string类型 和number类型
//同时返回 string类型 和number类型 (代码冗余)
function getData1(value: string): string {
return value;
}
function getData2(value: number): number {
return value;
}
any可以解决这个问题:
//同时返回 string类型 和number类型 any可以解决这个问题
function getData(value: any): any {
return value;
}
- any放弃了类型检查,传入什么 返回什么。
- 比如:传入number 类型必须返回number类型
- 传入 string类型必须返回string类型
泛型类示例
// 泛型类:比如有个最小堆算法,需要同时支持返回数字和字符串
// a - z两种类型。 通过类的泛型来实现
// 改进前
class MinClass {
public list: number[] = [];
add(num: number) {
this.list.push(num);
}
min(): number {
var minNum = this.list[0];
for (var i = 0; i < this.list.length; i++) {
if (minNum > this.list[i]) {
minNum = this.list[i];
}
}
return minNum;
}
}
var m = new MinClass();
m.add(3);
m.add(22);
m.add(23);
m.add(6);
m.add(7);
alert(m.min());
//类的泛型
//改进后
class MinClas<T> {
public list: T[] = [];
add(value: T): void {
this.list.push(value);
}
min(): T {
var minNum = this.list[0];
for (var i = 0; i < this.list.length; i++) {
if (minNum > this.list[i]) {
minNum = this.list[i];
}
}
return minNum;
}
}
var m1 = new MinClas<number>(); /*实例化类 并且制定了类的T代表的类型是number*/
m1.add(11);
m1.add(3);
m1.add(2);
alert(m1.min());
var m2 = new MinClas<string>(); /*实例化类 并且制定了类的T代表的类型是string*/
m2.add("c");
m2.add("a");
m2.add("v");
alert(m2.min());
泛型接口
// 函数类型接口
interface ConfigFn {
(value1: string, value2: string): string;
}
var setData: ConfigFn = function (value1: string, value2: string): string {
return value1 + value2;
};
setData('name','张三');
// 泛型接口的第一种方式
interface ConfigFn {
<T>(value: T): T;
}
var getData01: ConfigFn = function <T>(value: T): T {
return value;
};
// 泛型接口的第二种方式
interface ConfigFn<T> {
(value: T): T;
}
function getData02<T>(value: T): T {
return value;
}
var myGetData: ConfigFn<string> = getData02;