1.泛型函数:
// 泛型// any放弃了类型检查 我们应该传入什么,返回什么; 比如:传入number类型就返回number类型,传入string类型就返回string类型;// any则表示传入的类型参数和返回的可以不一致;function getValue(value: any): any {return value;}getValue(345);getValue("张三");// 泛型:可以支持不特定的数据类型 传入的类型参数和返回的要一致;// T表示泛型,具体什么类型是调用这个方法的时候决定的;function getName<T>(value: T): T {return value;}getName<number>(111);getName<number>("111");//错误写法getName<string>("李四");

// 错误返回值function getName2<T>(value: T): T {return "1233333";}getName2<number>(111);getName2<string>("李四");// 正确写法function getName3<T>(value: T): any {return "1233333";}getName3<number>(111);getName3<string>("李四");
2.泛型类:
通俗理解:泛型就是解决 类、接口、方法的复用,以及对不特定的数据类型的支持(类型校验)
// 泛型类:比如有个最小堆的算法,需要同时支持返回字符串和数字两种类型,可以通过泛型来实现;class MinNum {public list: number[] = [];add(num: number) {this.list.push(num);}min(): number {let minNum = this.list[0];for (let i = 0, len = this.list.length; i < len; i++) {if (minNum > this.list[i]) {minNum = this.list[i];}}return minNum;}}let m = new MinNum();m.add(33);m.add(36);m.add(3);m.add(13);m.add(98);alert(m.min());//例二class MinNum<T> {public list: T[] = [];add(num: T): void {this.list.push(num);}min(): T {let minNum = this.list[0];for (let i = 0, len = this.list.length; i < len; i++) {if (minNum > this.list[i]) {minNum = this.list[i];}}return minNum;}}let m1 = new MinNum<number>(); //实例化类,并且制定了类的T代表类型是nuberm1.add(33);m1.add(36);m1.add(3);m1.add(1);m1.add(98);alert(m1.min());let m2 = new MinNum<string>(); //实例化类,并且制定了类的T代表类型是nuberm2.add("t");m2.add("b");m2.add("f");m2.add("g");m2.add("z");alert(m2.min());//这里用的是ACSII进行大小比较的
3.泛型接口:
//函数类型接口interface ConfigFn {(value1: string, value2: string): string;}var setData: ConfigFn = function (name: string, age: string): string {return name + ":" + age;};alert(setData("name", "张三"));//第一种写法interface ConfigFn {<T>(value1: T): T;}var setData2: ConfigFn = function <T>(name: T): T {return name;};alert(setData2<string>("name"));alert(setData2<string>(333));//错误//第二种写法interface ConfigFn<T> {(value1: T): T;}function getData<T>(name: T): T {return name;}var myData: ConfigFn<number> = getData;alert(myData(2222));alert(myData("2222"));//错误
