我正在尝试使用类作为注册表方法的输入值,其中返回值是该实例的缓存实例。但是,我找不到使这种类型安全的方法。
我想要的是这样的
class MyRegistry {
getInstance<T, C extends Class<T>>(cls: C): T;
}
let x: MyThing = registry.getInstance(MyThing);
有没有办法使这项工作有效?我知道有很多方法可以输入可更新内容,但是我找不到找到具体的返回值的方法。
答案 0 :(得分:1)
您的参数类型应描述您作为参数传递的Class的构造函数。这可以通过通用接口来实现:
interface Class<T> {
new (...args: any[]): T;
}
class MyRegistry {
getInstance<T>(param: Class<T>): T {
// do your magic
}
}
您可以在工作here中看到它。
如果您需要使用子类C,那么当然可以通过以下方式轻松扩展:
class MyRegistry {
getInstance<T, C extends T>(param: Class<C>): T {
// do your magic
}
}
答案 1 :(得分:0)
您需要使用构造函数签名来使编译器从构造函数中提取实例类型:
class MyRegistry {
getInstance<T>(cls: new (...args: any[])=> T): T {
return null as any;
}
}
class MyThing { private x: number }
let registry = new MyRegistry();
let x = registry.getInstance(MyThing); // inffered as MyThing