在函数中使用泛型
这里 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];
}