泛型用于创建可重用组件,一个组件可以支持多种数据类型,使用时传入类型作为参数。TypeScript中使用泛型和Java基本一样。
function identity<T>(arg: T): T {
return arg;
}
let output = identity<string>("myString"); // type of output will be 'string'
实际上,使用any也可以实现这种功能,但丢失了类型信息,不符合软件工程的思想,所以推荐尽量用泛型,在强类型语言中,any的作用仅仅是在不破坏代码可读性的前提下,替代一个很长却又显而易见的类型声明。
泛型函数类型和普通函数类型相同。只不过一些数据类型是用T表示。(不只是用T,其他字母也可以)
function identity<T>(arg: T): T {
return arg;
}
let myIdentity: <T>(arg: T) => T = identity;
interface GenericIdentityFn {
<T>(arg: T): T;
}
interface GenericIdentityFn<T> {
(arg: T): T;
}
class GenericNumber<T> {
zeroValue: T;
add: (x: T, y: T) => T;
}
如上述代码所示,和Java基本是一样的。
假设这样一种情况,泛型可能是一个有length属性的对象,但定义泛型方法时,T没有length属性,TypeScript和Java的解决方式是完全相同的,添加泛型约束条件,使用T 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;
}
注意:这样定义的泛型不再适用于任何类型,只适用于符合Lengthwise接口的类型。