typescript 中很多地方都和 java 和 C# 相似,如果 有 java 和 C# 的同学入手typeScript 会简单很多,
下面这里使用代码来表示和展现泛型的定义和使用
// 泛型:在类、接口、函数中对不确定(未知)的数据类型的支持,提高 类、接口、函数代码的复用性,减少冗余 // 开发人员可以根据不同的数据类型使用同一个接口、函数或者类 /* * * 以下例子 * 定一个获取最小值的函数,当获对应的集合为 数字 时,需编写一个 针对数字集合 获取最小值的函数, * 当集合为 字符串 时,则需另外定义一个针对字符串集合获取最小值得函数, * 这时就会会造成代码的冗余,代码复用性低 * 如下: */ function min1(list:number[]):number{ let minRes:number = list[0 ]; list.forEach((item, index) => { if (item < minRes){ minRes = item; } }); return minRes; } function min2(list:string[]):string{ let minRes:string = list[0 ]; list.forEach((item, index) => { if (item < minRes){ minRes = item; } }); return minRes; } console.log(min1([ 9,3,4,2,5])); // 输出 2 console.log(min2(['r','a','c','b','h','f'])); // 输出 a /* * * 使用泛型则可以解决以上问题 * 传入和返回的数据类型由函数调用者自己来决定, 无需多写冗余的代码 * T 代表未知类型, 也可用用其他自定义单词或者字母表示 */ function min<T> (list:T[]):T { let minRes:T = list[0 ]; list.forEach((item, index) => { if (item < minRes){ minRes = item; } }); return minRes; } console.log(min1([ 9,3,4,2,5])); // 输出 2 console.log(min2(['r','a','c','b','h','f'])); // 输出 a /* * * 泛型类 */ class Operation <T> { list:T[] = []; constructor(){} add(v:T): void { this .list.push(v); } getList():T[]{ return this .list; } min():T{ let minRes:T = this .list[0 ]; this .list.forEach((item, index)=> { if (item < minRes){ minRes = item; } }); return minRes; } } // 指定类型为number类型 let o = new Operation<number>(); // 实例化类,并指定了类中 T 代表的是 number类型 // o.add('e'); //报错,必须为number类型 o.add(6 ); o.add( 4 ); o.add( 8 ); o.add( 7 ); console.log(o.getList()); // 输出: [6, 4, 8, 7] console.log(o.min()); // 输出: 4 let o1 = new Operation<string>(); // 实例化类,并指定了类中 T 代表的是 string类型 // o1.add(6); //报错,必须为字符串类型 o1.add('e' ); o1.add( 'n' ); o1.add( 'b' ); o1.add( 'l' ); console.log(o1.getList()); // 输出: ["e", "n", "b", "l"] console.log(o1.min()); // 输出: b /* * * 泛型接口 */ interface Z <T> { value:T; getValue():T; } // 第一种: 直接在类中定义指定类型 class A implements Z<string> { value:string; constructor(name:string){ this .value = name; } getValue(): string { return this .value; } } // 实例化类时,传入指定类型 let a = new A('aaa' ); alert(a.getValue()) // 第二种:在类中指定任意类型 class B<Q> implements Z<Q> { value :Q; constructor(name:Q){ this .value = name; } getValue(): Q { return this .value; } } // 实例化类时,可指定任意的类型 let b = new B<number>(1111 ); alert(b.getValue()); let b1 = new B<string>('b1b1b1' ); alert(b1.getValue())
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did223461