[Typescript 泛型学习] |学习记录
泛型:
类型变量:它是一种特殊的变量,只用于表示类型而不是值。
function identity(arg: T): T { return arg; }
T就是类型变量。
我们把这个版本的identity函数叫做泛型,因为它可以适用于多个类型。
泛型函数的两种使用方法:
1、传入所有的参数,包含类型参数:使用了<>括起来而不是()
let output = identity(“myString”); // type of output will be ‘string’
2、更普遍的方式:类型推论 – 即编译器会根据传入的参数自动地帮助我们确定T的类型。注意我们没必要使用尖括号(<>)来明确地传入类型;编译器可以查看myString的值,然后把T设置为它的类型。
let output = identity(“myString”); // type of output will be ‘string’
另外,我们可以把泛型变量T当做类型的一部分使用,而不是整个类型:
function loggingIdentity(arg: T[]): T[] {
console.log(arg.length); // Array has a .length, so no more error
return arg;
}
T[] 等同于 T的写法
泛型接口:
interface GenericIdentityFn { (arg: T): T; } function identity(arg: T): T { return arg; } let myIdentity: GenericIdentityFn = identity;
泛型类:
泛型类使用( <>)括起泛型类型,跟在类名后面
class GenericNumber { zeroValue: T; add: (x: T, y: T) => T; } let myGenericNumber = new GenericNumber(); myGenericNumber.zeroValue = 0; myGenericNumber.add = function(x, y) { return x + y; };
类有两部分:静态部分和实例部分。 泛型类指的是实例部分的类型,所以类的静态属性不能使用这个泛型类型。
泛型约束:
我们定义一个接口来描述约束条件,可以使用extends来进行约束
interface Lengthwise { length: number; } function loggingIdentity(arg: T): T { console.log(arg.length); // Now we know it has a .length property, so no more error return arg; }
我们需要传入符合约束类型的值,必须包含必须的属性:
loggingIdentity({length: 10, value: 3});