基本
写法
// 定义function 函数名<T> (param1: string, param2: T): Array<T> {let result: T[] = [];// ...return result;}let 函数名 = function<T> (param1: string, param2: T): Array<T> {}// 调用函数名<number>();
extends
泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。
使用:函数调用的时候、类实例化的时候
一个或多个类型参数
// 第2个参数用了泛型function createArray<T>(length: number, value: T): Array<T> {let result: T[] = [];for (let i = 0; i < length; i++) {result[i] = value;}return result;}createArray<string>(3, 'x'); // ['x', 'x', 'x']createArray(3, 'x'); // ['x', 'x', 'x'] 用了类型推断
泛型约束
我们使用了 extends 约束了泛型 T 必须符合接口 Lengthwise 的形状,也就是必须包含 length 属性。
interface Lengthwise {length: number;}function loggingIdentity<T extends Lengthwise>(arg: T): T {console.log(arg.length);return arg;}
应用:
多个泛型相互约束
function copyFields<T extends U, U>(target: T, source: U): T {for (let id in source) {// 这里是类型断言为T类型,只出现T含有的id// 试想如果source有个e: 30,<T>source就不会出现etarget[id] = (<T>source)[id];}return target;}let x = { a: 1, b: 2, c: 3, d: 4 };copyFields(x, { b: 10, d: 20 });
泛型接口
interface CreateArrayFunc {<T>(length: number, value: T): Array<T>;}let createArray: CreateArrayFunc;
interface CreateArrayFunc<T> {(length: number, value: T): Array<T>;}// 注意,此时在使用泛型接口的时候,需要定义泛型的类型let createArray: CreateArrayFunc<any>;
createArray = function<T>(length: number, value: T): Array<T> {}
泛型类
class GenericNumber<T> {zeroValue: T;add: (x: T, y: T) => T;}// 实例化的时候,传入number类型let myGenericNumber = new GenericNumber<number>();myGenericNumber.zeroValue = 0;myGenericNumber.add = function(x, y) { return x + y; };
泛型参数的默认类型
function createArray<T = string>(length: number, value: T): Array<T> {}
