认识泛型

TypeScript也实现了类型于C#和Java的泛型以实现类型的参数化,我们先看一个需求:

 function identity(arg: any): any {
return arg;
}

我们希望方法identity可以传入任意类型,并且返回传入的类型,这样写可以达到效果但是不能确定返回的类型,使用泛型的写法如下:

 function identity<T>(arg: T): T {
return arg;
} var output = identity<string>("myString"); // type of output will be 'string'
var output = identity("myString"); // type of output will be 'string'

我们可以指定类型,也可以让编译器自动来识别类型。

泛型数组

我们也可以通过泛型来指定一个数组,写法如下:

 function loggingIdentity<T>(arg: T[]): T[] {
console.log(arg.length); // Array has a .length, so no more error
return arg;
} function loggingIdentity<T>(arg: Array<T>): Array<T> {
console.log(arg.length); // Array has a .length, so no more error
return arg;
}

泛型类型

我们可以指定一个带有泛型的函数:

 function identity<T>(arg: T): T {
return arg;
} var myIdentity: <U>(arg: U)=>U = identity;

还有另一种写法:

 function identity<T>(arg: T): T {
return arg;
} var myIdentity: {<T>(arg: T): T} = identity;

使用函数接口的写法如下:

 interface GenericIdentityFn {
<T>(arg: T): T;
} function identity<T>(arg: T): T {
return arg;
} var myIdentity: GenericIdentityFn = identity;

同时泛型还可以作为类型的参数而不是方法的参数,写法如下:

 interface GenericIdentityFn<T> {
(arg: T): T;
} function identity<T>(arg: T): T {
return arg;
} var myIdentity: GenericIdentityFn<number> = identity;

泛型类

泛型除了可以用在接口上以外,当然还可以用在类上:

 class GenericNumber<T> {
zeroValue: T;
add: (x: T, y: T) => T;
} var myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; }; var stringNumeric = new GenericNumber<string>();
stringNumeric.zeroValue = "";
stringNumeric.add = function(x, y) { return x + y; };
alert(stringNumeric.add(stringNumeric.zeroValue, "test"));

使用方法和C#与Java一致。

泛型约束

之前的泛型可以是任意的类型,我们还可以约束泛型的类型,我们先看一个会报错的例子:

 function loggingIdentity<T>(arg: T): T {
console.log(arg.length); // Error: T doesn't have .length
return arg;
}

报错原因是,类型T没有length属性,我们可以为类型T指定一个类型,如下:

 interface Lengthwise {
length: number;
} function loggingIdentity<T extends Lengthwise>(arg: T): T {
console.log(arg.length); // Now we know it has a .length property, so no more error
return arg;
}

写法是通过extends来指定类型T的类型必须是实现了Lengthwise接口的类型。

调用如下:

 loggingIdentity(3);  // Error, number doesn't have a .length property
loggingIdentity({length: 10, value: 3});

泛型约束泛型

某些情况下,我们可能会有如下的需求:

 function find<T, U extends Findable<T>>(n: T, s: U) {   // errors because type parameter used in constraint
// ...
}
find (giraffe, myAnimals);

这种写法会报错,可以使用下面正确的写法来达到效果:

 function find<T>(n: T, s: Findable<T>) {
// ...
}
find(giraffe, myAnimals);

在泛型中使用类类型

有时我们希望可以指定泛型的构造函数和属性,写法如下:

 function create<T>(c: {new(): T; }): T {
return new c();
}

再看另外一个例子:

 class BeeKeeper {
hasMask: boolean;
} class ZooKeeper {
nametag: string;
} class Animal {
numLegs: number;
} class Bee extends Animal {
keeper: BeeKeeper;
} class Lion extends Animal {
keeper: ZooKeeper;
} function findKeeper<A extends Animal, K> (a: {new(): A;
prototype: {keeper: K}}): K { return a.prototype.keeper;
} findKeeper(Lion).nametag; // typechecks!

TypeScript学习笔记(六):泛型的更多相关文章

  1. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  2. Java泛型学习笔记 - (六)泛型的继承

    在学习继承的时候, 我们已经知道可以将一个子类的对象赋值给其父类的对象, 也就是父类引用指向子类对象, 如: Object obj = new Integer(10); 这其实就是面向对象编程中的is ...

  3. Typescript 学习笔记七:泛型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  4. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  5. Typescript 学习笔记四:回忆ES5 中的类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  6. Typescript 学习笔记二:数据类型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  7. Typescript 学习笔记三:函数

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  8. Typescript 学习笔记一:介绍、安装、编译

    前言 整理了一下 Typescript 的学习笔记,方便后期遗忘某个知识点的时候,快速回忆. 为了避免凌乱,用 gitbook 结合 marketdown 整理的. github地址是:ts-gitb ...

  9. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  10. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

随机推荐

  1. HDU 4870 Rating (2014 Multi-University Training Contest 1)

    Rating Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  2. bzoj1185

    一遇到数学题和计算几何题我就要调半天…… 玛雅,我真是太弱了…… 基本思路很简单,先上凸包,然后矩形与凸包一边重合,然后旋转卡壳即可 然而我没怎么写过计算几何题,一开始写的各种囧,后来看了hzwer的 ...

  3. 前端JS对后台传递的timestamp的转换

    后台传递的timestamp类型的数据的JSON: Date.prototype.format = function(format) { var o = { "M+" : this ...

  4. OK - A byte of python - 读书笔记

    看这本书的目的:再熟悉基本概念. 大部分都是知道,但是需要 明确 出来的 概念. - 欢迎吐槽错误,非常感谢. <A byte of python> - THIS 1. 组织行 - 形式: ...

  5. FFmpeg介绍及参数详细说明

    FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库l ...

  6. 【转】visual studio 2012进行C语言开发[图文]

    原文网址:http://blog.csdn.net/chengyafei0104/article/details/9826025 现在大家计算机大概都脱离XP了,so,之前蛮多可以用的编译器,可能放在 ...

  7. 安装oracle XML Database 组件

    近期部署项目数据库,编译包时遇到错误:   PACKAGE CTG.CTG_CSB_COMMON 编译错误  错误:PLS-00201: identifier 'XMLDOM' must be dec ...

  8. MySql相关及如何删除MySql服务

    又会一招–如何删除MySql服务 进入“控制面板->管理工具->服务”查看才发现,虽然MYSQL已经卸载了,但是MYSQL服务仍然残留在系统服务里.又不想改服务名,改怎么办呢. 后来上百度 ...

  9. 对象指针与this指针

    对象指针分为三大类 [1]指向对象的指针 [2]指向对象成员的指针(数据类) [3]指向对象成员的指针(函数类) #include<iostream> using namespace st ...

  10. ubuntu下php5扩展mysqli

    看网上说的都是自己编译源码,试了一下其实这样就可以了 sudo apt-get instal php5-mysql