我有一个带有静态属性的抽象类Model
和另一个泛型类Controller<T extends Model>
。我想在Controller的一个实例中访问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说'T' only refers to a type, but is being used as a value here.
有没有简单的方法来实现这一目标?或者我应该为Controller
的每个遗产继承Model
并实现一个方法来检索值?
答案 0 :(得分:9)
打字稿中无法做到这一点。通用类型参数只能出现在声明中出现类型的位置,它们在运行时无法访问。原因很简单 - 为泛型类的每个方法生成单个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);