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())

最新文章

  1. Dapper where Id in的解决方案
  2. 转:界面之下:还原真实的 MVC、MVP、MVVM 模式
  3. php中的抽象类(abstract class)和接口(interface)
  4. 基于netty的心跳机制实现
  5. WPF中的StackPanel、WrapPanel、DockPanel
  6. Linux 释放cached内存
  7. 如何自定义RecycleView item的间距
  8. BZOJ 1051 受欢迎的牛
  9. CSS基本知识介绍
  10. Tk::Table
  11. sping+maven+mybatis+ehcache续之实现mapper
  12. ftk学习记(消息框篇)
  13. easyui小清新俺也晒晒 视频管理软件bs项目
  14. Grunt插件之LiveReload 实现页面自动刷新,所见即所得编辑
  15. EBS销售(OE)模块常用表
  16. 怎么让Word形状里的文字上下左右居中
  17. api日常总结:前端常用js函数和CSS常用技巧
  18. roof
  19. window.opener方法的使用 js 跨域
  20. 惠普hp服务器通过iLO接口远程安装操作系统

热门文章

  1. elementUI-tree组件 懒加载
  2. (八)Knockout 组件 Components
  3. Oracle11g R2客户端安装图文详解过程
  4. 【Java】单点登录(SSO)
  5. [LeetCode] 119. Pascal&#39;s Triangle II 杨辉三角 II
  6. [LeetCode] 399. Evaluate Division 求除法表达式的值
  7. 自定义电脑IP地址
  8. odoo 流水码 编码规则
  9. php利用crontab执行 5分钟发邮件给用户 (包含每分钟发一次)
  10. .net webapi跨域 web.config配置