TypeScript学习笔记(六):泛型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了TypeScript学习笔记(六):泛型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3364字,纯文字阅读大概需要5分钟。
内容图文
认识泛型
TypeScript也实现了类型于C#和Java的泛型以实现类型的参数化,我们先看一个需求:
1 function identity(arg: any): any { 2 return arg; 3 }
我们希望方法identity可以传入任意类型,并且返回传入的类型,这样写可以达到效果但是不能确定返回的类型,使用泛型的写法如下:
1 function identity<T>(arg: T): T { 2return arg; 3} 45var output = identity<string>("myString"); // type of output will be ‘string‘6var output = identity("myString"); // type of output will be ‘string‘
我们可以指定类型,也可以让编译器自动来识别类型。
泛型数组
我们也可以通过泛型来指定一个数组,写法如下:
1 function loggingIdentity<T>(arg: T[]): T[] { 2 console.log(arg.length); // Array has a .length, so no more error3return arg; 4} 56function loggingIdentity<T>(arg: Array<T>): Array<T> { 7 console.log(arg.length); // Array has a .length, so no more error8return arg; 9 }
泛型类型
我们可以指定一个带有泛型的函数:
1 function identity<T>(arg: T): T { 2return arg; 3} 45var myIdentity: <U>(arg: U)=>U = identity;
还有另一种写法:
1 function identity<T>(arg: T): T { 2return arg; 3} 45var myIdentity: {<T>(arg: T): T} = identity;
使用函数接口的写法如下:
1 interface GenericIdentityFn { 2 <T>(arg: T): T; 3} 45function identity<T>(arg: T): T { 6return arg; 7} 89var myIdentity: GenericIdentityFn = identity;
同时泛型还可以作为类型的参数而不是方法的参数,写法如下:
1 interface GenericIdentityFn<T> { 2 (arg: T): T; 3} 45function identity<T>(arg: T): T { 6return arg; 7} 89var myIdentity: GenericIdentityFn<number> = identity;
泛型类
泛型除了可以用在接口上以外,当然还可以用在类上:
1 class GenericNumber<T> { 2 zeroValue: T; 3 add: (x: T, y: T) => T; 4} 5 6var myGenericNumber = new GenericNumber<number>(); 7 myGenericNumber.zeroValue = 0; 8 myGenericNumber.add = function(x, y) { return x + y; }; 910var stringNumeric = new GenericNumber<string>(); 11 stringNumeric.zeroValue = ""; 12 stringNumeric.add = function(x, y) { return x + y; }; 13 alert(stringNumeric.add(stringNumeric.zeroValue, "test"));
使用方法和C#与Java一致。
泛型约束
之前的泛型可以是任意的类型,我们还可以约束泛型的类型,我们先看一个会报错的例子:
1 function loggingIdentity<T>(arg: T): T { 2 console.log(arg.length); // Error: T doesn‘t have .length3return arg; 4 }
报错原因是,类型T没有length属性,我们可以为类型T指定一个类型,如下:
1 interface Lengthwise { 2 length: number; 3 } 4 5 function loggingIdentity<T extends Lengthwise>(arg: T): T { 6 console.log(arg.length); // Now we know it has a .length property, so no more error7return arg; 8 }
写法是通过extends来指定类型T的类型必须是实现了Lengthwise接口的类型。
调用如下:
1 loggingIdentity(3); // Error, number doesn‘t have a .length property2 loggingIdentity({length: 10, value: 3});
泛型约束泛型
某些情况下,我们可能会有如下的需求:
1 function find<T, U extends Findable<T>>(n: T, s: U) { // errors because type parameter used in constraint2// ...3} 4 find (giraffe, myAnimals);
这种写法会报错,可以使用下面正确的写法来达到效果:
1 function find<T>(n: T, s: Findable<T>) { 2// ...3} 4 find(giraffe, myAnimals);
在泛型中使用类类型
有时我们希望可以指定泛型的构造函数和属性,写法如下:
1 function create<T>(c: {new(): T; }): T { 2returnnew c(); 3 }
再看另外一个例子:
1 class BeeKeeper { 2 hasMask: boolean; 3} 4 5class ZooKeeper { 6 nametag: string; 7} 8 9class Animal { 10 numLegs: number; 11} 1213class Bee extends Animal { 14 keeper: BeeKeeper; 15} 1617class Lion extends Animal { 18 keeper: ZooKeeper; 19} 2021function findKeeper<A extends Animal, K> (a: {new(): A; 22 prototype: {keeper: K}}): K { 2324return a.prototype.keeper; 25} 2627 findKeeper(Lion).nametag; // typechecks!
原文:http://www.cnblogs.com/hammerc/p/4908989.html
内容总结
以上是互联网集市为您收集整理的TypeScript学习笔记(六):泛型全部内容,希望文章能够帮你解决TypeScript学习笔记(六):泛型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。