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://www.haodehen.cn/did223461