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

TypeScript_泛型的更多相关文章

  1. 一起学 Java(三) 集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  2. .NET面试题系列[8] - 泛型

    “可变性是以一种类型安全的方式,将一个对象作为另一个对象来使用.“ - Jon Skeet .NET面试题系列目录 .NET面试题系列[1] - .NET框架基础知识(1) .NET面试题系列[2] ...

  3. C#4.0泛型的协变,逆变深入剖析

    C#4.0中有一个新特性:协变与逆变.可能很多人在开发过程中不常用到,但是深入的了解他们,肯定是有好处的. 协变和逆变体现在泛型的接口和委托上面,也就是对泛型参数的声明,可以声明为协变,或者逆变.什么 ...

  4. 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)

    建议106:动态代理可以使代理模式更加灵活 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发.我们知道一个静态代理是通过主题角色(Prox ...

  5. 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  6. C#泛型详解(转)

    初步理解泛型: http://www.cnblogs.com/wilber2013/p/4291435.html 泛型中的类型约束和类型推断 http://www.cnblogs.com/wilber ...

  7. C# 泛型

    C# 泛型 1.定义泛型类 在类定义中包含尖括号语法,即可创建泛型类: class MyGenericClass<T> { //Add code } 其中T可以遵循C#命名规则的任意字符. ...

  8. java8中lambda表达式的应用,以及一些泛型相关

    语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...

  9. java 泛型

    1.Student stu =tool.getObj();右边得到的是Object类型,需要向下转型,强转换. 2. 3. 4.泛型方法不能被静态修饰这样写 5.如果想定义定义静态泛型方法,只能这样写 ...

随机推荐

  1. mysql union all limit的使用

    To apply ORDER BY or LIMIT to an individual SELECT, place the clause inside the parentheses that enc ...

  2. 安装Rancher容器化管理平台

    卸载已有的避免冲突 yum remove docker  docker-common docker-selinux docker-engine   安装需要的软件包,yum-util 提供yum-co ...

  3. 001 okhttp3的POST使用

    继续使用上面的项目 1.被调用的项目 package com.jun.web2forokhttp.okhttp; import com.jun.web2forokhttp.bean.HttpDomai ...

  4. django -xadmin 详解 功能实现及orm 的复习

    django 在xadmin中自定义内容的变量及优化汇总 一: 首先下载xadmin pip install git+git://github.com/sshwsfc/xadmin.git@djang ...

  5. SAP 更新模块1

    RSM13000 / RSM13000 / 5.747FORM / VB_CALL_FUNC CALL 'ThVBCall' ID 'OPCODE' FIELD vb_update_modul_pro ...

  6. Archer和ArcherUI配置说明

    如果Bladex的网关端口是80,则需要修改Archer服务端口,并修改ArcherUI的vue.config.js的端口

  7. LeetCode_437. Path Sum III

    437. Path Sum III Easy You are given a binary tree in which each node contains an integer value. Fin ...

  8. 修改服务器时间以后 cookie无法保存

    修改了服务器时间以后发现,cookie无法保存.通过查看异步请求的响应头信息  Date是之前修改的信息,并不是当前的时间. header('Date: Mon, 17 Mar 2015 05:34: ...

  9. openstack-keystone外组件命令行

    摘自openstack文档 镜像(glance) 列出您可以访问的镜像 $ openstack image list 删除指定的镜像 $ openstack image delete IMAGE 描述 ...

  10. scrapy爬虫,cmd中执行日志中显示了爬取的内容,但是运行时隐藏日志后(运行命令后添加--nolog),就没有输出结果了

    cmd下执行scrapy爬虫程序,不报错也没有输出,解决方案 想要执行parse能够在cmd看到parse函数的执行结果: 解决方法: settings.py 中设置  ROBOTSTXT_OBEY  ...