1. 泛型是什么
软件工程中,我么不仅要创建一致的定义良好的API,同时也要考虑可重用性。组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。
像在C#和Java这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据,这样用户就可以以自己的数据类型来使用组件。
泛型就是解决类、接口、方法的复用性、以及对不特定数据类型的支持。
// 泛型:可以支持不特定的数据类型 要求:传入的参数和返回的参数一致
// T表示泛型,具体是什么类型,是在调用这个方法的时候决定的
function getData<T>(value:T):T{
return value;
}
getData<number>(123); // T穿入参数类型
function getData1<T>(value: T):any{
return '固定字符串';
}
getData1<string>('this is a string');
2. 泛型类
class MinClass<T> {
list: T[] = [];
add(num: T):void{
this.list.push(num);
}
min():T{
let min = this.list[0];
for(let i = 0,len=this.list.length;i < len; i++){
if(min > this.list[i]){
min = this.list[i];
}
}
return min;
}
}
let min = new MinClass<number>(); // 实例化类,并且指定类型为number
min.add(3);
min.add(1);
min.add(5);
min.add(2);
min.add(4);
console.log(min.min());
3. 泛型接口
interface Config{
<T>(value: T):T;
}
let getData: Config = function<T>(value: T): T{
return value + value1;
}
getData<string>('张三');
interface Config<T>{
(value: T):T;
}
function getData<T>(value: T):T{
return value;
}
let getDataValue: Config<string> = getData;
getDataValue('name');
4. 把类当作参数类型的泛型类
例如:定义一个User的类,这个类的作用就是映射数据库的字段,然后定义一个MysqlDb的类用于操作数据库,然后把User类作为擦拭农户传入到MysqlDb中
class User{
userName: string | undefined;
password: string | undefined;
}
class MysqlDb<T> {
add(user: T): boolean{
retrun true;
}
}
let user = new User();
user.userName = '张三';
user.password = '123456';
let db = new MysqlDb<User>();
db.add(user);