在泛型约束中使用类型参数
可以声明一个类型参数,且它被另一个类型参数所约束。比如想要用属性名从对象中获取这个属性。且确保这个属性在对象上存在,需要在这两个类型之间使用约束。
function getProperty<T, K extends keyof T>(obj: T, key: K) {
return obj[key];
}
let x = {
a: 1,
b: 2,
c: 3,
d: 4,
};
console.log(getProperty(x, "a"));
console.log(getProperty(x, "m"));
// Argument of type '"m"' is not assignable to parameter of type '"a" | "b" | "c" | "d"'.
在泛型里使用类类型
function create<T>(c: { new (): T }): T {
return new c();
}
一个更高级的例子,使用原型属性推断并约束构造函数与类实例的关系
class BeeKeeper {
hasMask: boolean;
}
class ZooKeeper {
nameTag: string;
}
class Animal {
nemLegs: number;
}
class Bee extends Animal {
keeper: BeeKeeper;
}
class Lion extends Animal {
keeper: ZooKeeper;
}
function createInstance<A extends Animal>(c: new () => A): A {
return new c();
}
createInstance(Lion).keeper.nameTag // typechecks
createInstance(Bee).keeper.hasMask // typechecks