我有一个带有静态属性的抽象类和另一个泛型类。我想访问控制器实例中model的静态属性。应该是这样的:
abstract class Model{
static hasStatus: boolean = false;
}
class MyModel extends Model{
static hasStatus = true;
}
class Controller<T extends Model>{
constructor(){
if(T.hasStatus)...
}
}
但是TS说
有什么简单的方法可以做到这一点吗?或者我应该为每个继承的
Model
子类Controller<T extends Model>
并实现一个方法来检索值? 最佳答案
在typescript中没有办法这样做。泛型类型参数只能出现在类型可能出现在声明中,它们在运行时不可访问。原因是简单的——为泛型类的每种方法生成单个JavaScript函数,并且该函数不知道哪种实际类型作为泛型类型参数传递。
如果在运行时需要这些信息,则必须向构造函数添加一个参数,并在调用它时自己传递一个类型:
class Controller<T extends Model>{
constructor(cls: typeof Model){
if (cls.hasStatus) {
}
}
}
let c = new Controller<MyModel>(MyModel);
这里是如何编译JavaScript来说明这一点的,在那里没有任何通用参数,如果你删除了
cls
参数,就没有关于“hasStatus
”应该从哪里来的信息。var Controller = (function () {
function Controller(cls) {
if (cls.hasStatus) {
}
}
return Controller;
}());
var c = new Controller(MyModel);