在函数中使用泛型

这里 T 可以代表任意类型。

function identity<T>(arg: T): T {
    return arg;
}

使用时可以明确指定类型:

let output = identity<string>("myString"); 

不过更多时候是交给 TypeScript 进行类型推断:

let output = identity("myString"); 

在接口中使用泛型

interface GenericIdentityFn {
    <T>(arg: T): T;
}

function identity<T>(arg: T): T {
    return arg;
}

let myIdentity: GenericIdentityFn = identity;

我们还可以把泛型参数提升到整个接口的层面,像下面这样:

interface GenericIdentityFn<T> {
    (arg: T): T;
}

然后在我们使用这个接口的时候,必须明确指定这个泛型参数的类型:

function identity<T>(arg: T): T {
    return arg;
}

let myIdentity: GenericIdentityFn<number> = identity;

我们得到的 myIdentity 方法只能接受数字作为参数。

为泛型添加约束

有时我们想为泛型增加一点约束,假设我们有一个 getLenght 方法:

function getLength(obj) {
    return obj.length;
}

我们参数 obj 只要是任何带有 length 属性的对象都可以。我们只需要为泛型参数加上这个限定条件即可:

function getLength<T extends {length: any}>(obj: T ):any {
    return obj.length;
}

扩展开来,我们可以定义一个 getProperty 方法:

function getProperty<T, K extends keyof T>(obj: T, key: K) {
    return obj[key];
}