//泛型 //泛型就是解决类、接口、方法的复用性,以及对不特定数据类型的支持 //可以支持不特定的数据类型,要求:传入的参数和返回的参数一致 //T表示泛型(只要是任意大写字母就可以),具体什么类型就是调用这个方法的时候决定的 function getData<T>(value:T):T{ return value; } getData<number>(123) getData<string>('123') //泛型类 class MinClass<T>{ public list:T[] = []; add(value:T):void{ this.list.push(value) } min():T{ var minNum = this.list[0]; this.list.map(item=>{ if(minNum>this.list[i]){ minNum = this.list[i] } }) return minNum } } let m1 = new MinClass<number>();//实力化类,并指定类的T类型代表number m1.add(2); m1.add(45); m1.add(34); m1.add(35); console.log(m1.min()) //把类当作参数的泛型类 class User{ name:string|undefined; age:number|undefined; constructor(params:{ name:string|undefined; age?:number|undefined; }){ this.name = params.name; this.age = params.age; } } class MysqlObj<T>{ add(user:T):void{ console.log(user) } } let u = new User({ name:'zhangsan', age:12 }) let ob = new MysqlObj<User>();//类当作参数的泛型类 ob.add(u) //泛型接口(第一种) interface ConfigFn{ <T>(value:T):T; } let getData2:ConfigFn = function<T>(value:T):T{ return value; } getData2<string>('zhangsan'); getData2<number>(123); //泛型接口(第二种) interface ConfigFn2<T>{ (value:T):T; } function getData3<T>(value:T):T{ return value; } let myGetData:ConfigFn2<string> = getData3; myGetData('20') getData2<number>(123);