TypeScript学习笔记(六):泛型
2024-10-14 04:56:50
认识泛型
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!
最新文章
- dex文件格式二
- mysql共享表空间转独立表空间
- activity启动模式区别和优化
- Oracle 应用于.NET平台
- jquery事件切换hover/toggle
- java实现最基础的socket网络通信
- PLS-00215:字符串长度限制在范围
- gulp+browserSync+nodemon 实现express 全端自动刷新的实践
- JFinal Db + Record模式 - ORM 框架
- Android05-UI02布局,自定义控件,ListView
- struts2标签库----数据标签详解
- 《JavaScript 高级程序设计》读书笔记一 简介
- 【转载】阿里云ECS服务器监控资源使用情况
- PHP $_SERVER[&#39;SCRIPT_FILENAME&#39;] 与 __FILE__ 的区别
- Linux内核哈希表分析与应用
- multiset多重集合容器(常用的使用方法总结)
- js 操作json对象增删改
- nzhtl1477-ただいま帰りました ( bfs )
- mac上用ssh登录服务失败的排查方法
- Linux下开发python django程序(设置admin后台管理模块)
热门文章
- uva11181Probability|Given
- UVa 11077 (循环分解 递推) Find the Permutations
- hdu 4609 3-idiots(快速傅里叶FFT)
- django - get_or_create() 使用提醒
- Java [leetcode 8] String to Integer (atoi)
- JS 代码编一个倒时器
- Loadrunner模拟Json请求
- STM32F407 外扩SRAM
- 常用SQL语句汇总整理
- 【ActiveX】实现安全接口