TypeScript中文手册
6,泛型
> 使用`泛型`来创建可重用的组件,一个组件可以支持多种类型的数据。 这样用户就可以以自己的数据类型来使用组件。 ### 6.1 泛型定义 ```typescript //使用any类型会导致这个函数可以接收任何类型的arg参数,但传入的类型与返回的类型不一致 function identity(arg: any): any { return arg; } ``` ```typescript //使用了类型变量,它是一种特殊的变量,只用于表示类型而不是值,可以使返回值的类型与传入参数的类型是相同的 //我们给identity添加了类型变量T。 T帮助我们捕获用户传入的类型(比如:number),之后我们就可以使用这个类型。 之后我们再次使用了T当做返回值类型。现在我们可以知道参数类型与返回值类型是相同的了。 这允许我们跟踪函数里使用的类型的信息。 function identity<T>(arg: T): T { return arg; } ``` - 定义了泛型函数后,可以用两种方法使用。 第一种是,传入所有的参数,包含类型参数: ```typescript //这里我们明确的指定了`T`是`string`类型,并做为一个参数传给函数,使用了`<>`括起来而不是`()`。 let output = identity<string>("myString"); // type of output will be 'string' ``` - 第二种方法更普遍。利用了*类型推论* – 即编译器会根据传入的参数自动地帮助我们确定T的类型: ```typescript let output = identity("myString"); // type of output will be 'string' ``` ### 6.2 使用泛型变量 ```typescript 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; } ``` ### 6.3 泛型类型 - 泛型函数 ```typescript function identity<T>(arg: T): T { return arg; } //泛型函数的类型与非泛型函数的类型没什么不同,只是有一个类型参数在最前面,像函数声明一样 let myIdentity: <T>(arg: T) => T = identity; //也可以使用不同的泛型参数名,只要在数量上和使用方式上能对应上就可以 let myIdentity: <U>(arg: U) => U = identity; //还可以使用带有调用签名的对象字面量来定义泛型函数 let myIdentity: {<T>(arg: T): T} = identity; ``` - 泛型接口 ```typescript interface GenericIdentityFn { <T>(arg: T): T; } function identity<T>(arg: T): T { return arg; } let myIdentity: GenericIdentityFn = identity; //指定泛型类型 let myIdentity: GenericIdentityFn<number> = identity; ``` - 泛型类 > 泛型类看上去与泛型接口差不多。 泛型类使用(`<>`)括起泛型类型,跟在类名后面。 > > 泛型类指的是实例部分的类型,所以类的静态属性不能使用这个泛型类型。 ```typescript class GenericNumber<T> { zeroValue: T; add: (x: T, y: T) => T; } let myGenericNumber = new GenericNumber<number>(); myGenericNumber.zeroValue = 0; myGenericNumber.add = function(x, y) { return x + y; }; ``` ### 6.4 泛型约束
顶部
收展
底部
[TOC]
目录
1,基础类型
2,变量声明
3,接口
4,类
5,函数
6,泛型
7,枚举
8,类型推论
9,类型兼容性
10,高级类型
11,符号Symbols
12,Iterators(迭代)
13,模块
14,命名空间
15,模块解析