我有一个带有静态属性的抽象类和另一个泛型类。我想访问控制器实例中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);

10-06 13:38
查看更多