-
https://m.runoob.com/manual/gitbook/TypeScript/_book/doc/handbook/Generics.html
-
泛型:可以支持多种类型的数据
-
泛型函数的定义
这里使用了类型变量,它是一种特殊的变量,只用于表示类型而不是值。
function identity<T>(arg: T): T {
return arg;
}
我们给identity添加了类型变量T。 T帮助我们捕获用户传入的类型(比如:number),之后我们就可以使用这个类型。 之后我们再次使用了T当做返回值类型。现在我们可以知道参数类型与返回值类型是相同的了。 这允许我们跟踪函数里使用的类型的信息。
- 泛型函数的使用
泛型函数定义后,可以用两种方法使用。
- 第一种是,传入所有的参数,包含类型参数:
let output = identity<string>("myString"); // type of output will be 'string'
这里我们明确的指定了T是字符串类型,并做为一个参数传给函数,使用了<>括起来而不是()。
2. 第二种方法更普遍。利用了类型推论,编译器会根据传入的参数自动地帮助我们确定T的类型:
let output = identity("myString"); // type of output will be 'string'
-
注意:无法创建泛型枚举和泛型命名空间。
-
类的静态属性不能使用泛型类型。
-
泛型约束
定义一个接口来描述约束条件。 创建一个包含.length属性的接口,使用这个接口和extends关键字还实现约束:
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;
}
现在这个泛型函数被定义了约束,因此它不再是适用于任意类型:
loggingIdentity(3); // Error, number doesn't have a .length property
我们需要传入符合约束类型的值,必须包含必须的属性:
loggingIdentity({length: 10, value: 3});