Typescript的泛型
软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性,组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。
泛型就是解决类、接口、方法的复用性、以及对不特定数据类型的支持(类型校验)
泛型函数:
// 指定返回值类型和传入的参数类型一致
function getData<T>(value:T):T{
return value;
}
// 仅指定传入的参数类型,返回any
function getData<T>(value:T):any{
return 'abc';
}
// 调用
getData<number>(123);
getData<string>('abc');
泛型类:
class MinClass<T> {
public list:T[] = [];
add(value:T):void{
this.list.push(value);
}
min():T{
var minValue = this.list[0];
for(var i=0; i<this.list.length; i++) {
if(minValue > this.list[i]) {
minValue = this.list[i];
}
}
return minValue;
}
}
var m1 = new MinClass<number>();
m1.add(2);
m1.add(1);
m1.add(5);
alert(m1.min());
var m2 = new MinClass<string>();
m2.add('c');
m2.add('e');
m2.add('b');
m2.add('g');
alert(m2.min());
泛型接口定义1:
interface ConfigFn {
<T>(value:T):T;
}
var getData:ConfigFn=function<T>(value:T):T {
return value;
}
alert(getData<string>('张三'));
alert(getData<number>(123));
泛型接口定义2:
interface ConfigFn<T> {
(value:T):T;
}
function getData<T>(value:T):T{
return value;
}
var myGetData:ConfigFn<string>=getData;
alert(getData<string>('张三'));
alert(getData<number>(123));
泛型类的应用:
class User {
userName:string | undefined;
password:string | undefined;
}
class ArticelCate {
title:string | undefined;
describe:string | undefined;
status:number | undefined;
constructor(parames:{title:string, describe:string, status?:number}) {
this.title = parames.title;
this.describe = parames.describe;
this.status = parames.status;
}
}
class MySqlDB<T> {
add(info:T):boolean {
console.log(info);
return true;
}
}
var u = new User();
u.userName = '张三';
u.password = '123456';
var db = new MySqlDB<User>();
db.add(u);
var a = new ArticelCate({title:'新闻', describe:'测试头条新闻'});
var db2 = new MySqlDB<ArticelCate>();
db2.add(a);