认识泛型

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. Tomcat 7.0配置SSL的问题及解决办法

    http://dong-shuai22-126-com.iteye.com/blog/1830209   以前一直在用Tomcat 6.0.29版本,今下载了apache-tomcat-7.0.33- ...

  2. strleng函数和filterHtml函数的据悉

    紧接着“CKEditor如何统计文字数量”,我想稍微说下,下面就filterHtml就是用来过滤全部html标签的. /** *过滤html标签 */ function filterHtml(s){ ...

  3. hdu 3948(后缀数组+RMQ)

    题意:求一个串中有多少不同的回文串. 分析:这一题的关键是如何去重,我表示我现在还没理解为什么这样去重,先放这里过两天再看!! //不同回文子串数目 #include <iostream> ...

  4. [Papers]NSE, $\pi$, Lorentz space [Suzuki, NA, 2012]

    $$\bex \sen{\pi}_{L^{s,\infty}(0,T;L^{q,\infty}(\bbR^3))} \leq \ve_*, \eex$$ with $$\bex \frac{2}{s} ...

  5. PIG的配置

    Pig是一个客户端应用程序,就算你要在Hadoop集群上运行Pig,也不需要在集群上装额外的东西.Pig的配置非常简单: 1.下载pig,网址http://pig.apache.org/ 2.在机器上 ...

  6. OutputFormat中OutputCommitter解析

    在hadoop中,由于一个Task可能由多个节点同时运行,当每个节点完成Task时,一个Task可能会出现多个结果,为了避免这种情况的出现,使用了OutPutCommitter.所以OutPutCom ...

  7. IOC框架Ninject实践总结

    原文地址:http://www.cnblogs.com/jeffwongishandsome/archive/2012/04/15/2450462.html IOC框架Ninject实践总结 一.控制 ...

  8. 【windows核心编程】DLL相关(1)

    DLL相关的东西 1.DLL的加载方式 隐式: #pragma comment(lib, "XX.lib"); 编译器去查找名为XX.dll的DLL,除了名字相同,该DLL和该LI ...

  9. 2016传统行业“互联网+”元年,你准备好了吗?

    李克强总理在2015年的政府报告中的提出了"互联网+"的概念! 2015年,几十.上百本以"互联网+"作为书名的书出版! 2015年,各种传统行业的信息化被冠上 ...

  10. BestCoder Round #75 解题报告

    King's Cake [思路] 递推 公式:f(n,m)=f(max(m,n-m),min(m,n-m))+1,n>m [代码] #include<cstdio> #include ...