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. merge同时包含增、改、删

    我们都知道oracle merge可以用来增和改,很少用它来删除.但是有时候我们仍然需要该特性,以提高性能,典型的场景就是将业务库逻辑删除的记录同步到查询库的时候,做真正的物理删除,这个时候merge ...

  2. 利用art.template模仿VUE

    首先先看一下Typescript代码: import template = require('art-template/lib/template-web'); interface TemplateBi ...

  3. mysql 某表某列支持 emoji

    ALTER TABLE `customer_user` MODIFY COLUMN `UserName`  varchar(30) CHARACTER SET utf8mb4 COLLATE utf8 ...

  4. Docker容器(六)——创建docker私有化仓库

    docker私有化仓库是为了节约带宽(外网速度慢或者干脆不能连外网),以及自己定制系统. (1).环境 youxi1 192.168.5.101 docker私有化仓库 youxi2 192.168. ...

  5. [转]使用apt安装nodejs10

    使用apt安装nodejs10 链接地址:https://blog.csdn.net/sunhaobo1996/article/details/80340513

  6. 【计算机视觉】目标检测中的指标衡量Recall与Precision

    [计算机视觉]目标检测中的指标衡量Recall与Precision 标签(空格分隔): [图像处理] 说明:目标检测性能指标Recall与Precision的理解. Recall与Precision ...

  7. (CSDN迁移) 替换字符串中的空格

    题目描述 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. public ...

  8. eNSP配置静态路由

    配置目标:如下拓扑结构,从CLIENT1去pingCLIENT2,ping通 拓扑结构 路由配置 配置各个路由表的核心思想是:只有这个路由表中有一个网段的网络号,才可以从这个路由器跳转到该网段,下面只 ...

  9. QT/C++ 类型转换

    "轻轻地我走了,正如我轻轻地来,我挥一挥衣袖,不带走一片云彩"------阿魔 1) int转为QString: QString::number(int) 2) std::stri ...

  10. 05 Mybatis的CRUD操作和Mybatis连接池

    1.CRUD的含义 CRUD是指在做计算处理时的增加(Create).读取(Retrieve)(重新得到数据).更新(Update)和删除(Delete)几个单词的首字母简写.主要被用在描述软件系统中 ...