Typescript的泛型
软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性,组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。
泛型就是解决类、接口、方法的复用性、以及对不特定数据类型的支持(类型校验)
泛型函数:
// 指定返回值类型和传入的参数类型一致function getData<T>(value:T):T{return value;}// 仅指定传入的参数类型,返回anyfunction 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);
