Typescript访问泛型类型的静态属性

Joh*_*ees 12 generics static class abstract typescript

我有一个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)...
    }
}
Run Code Online (Sandbox Code Playgroud)

但是TS说 'T' only refers to a type, but is being used as a value here.

有没有一种简单的方法来实现这一目标?或者我应该Controller为每个遗产继承子类Model并实现一个方法来检索值?

art*_*tem 9

打字稿中无法做到这一点.通用类型参数只能出现在声明中出现类型的位置,它们在运行时无法访问.原因很简单 - 为泛型类的每个方法生成单个javascript函数,并且该函数无法知道哪个实际类型作为泛型类型参数传递.

如果在运行时需要该信息,则必须向构造函数添加一个参数并在调用时自行传递一个类型:

class Controller<T extends Model>{
    constructor(cls: typeof Model){
        if (cls.hasStatus) {
        }
    }
}

let c = new Controller<MyModel>(MyModel);
Run Code Online (Sandbox Code Playgroud)

以下是编译为javascript时的外观,以说明这一点 - 那里没有通用参数,如果删除cls参数,则没有关于hasStatus应该来自何处的信息.

var Controller = (function () {
    function Controller(cls) {
        if (cls.hasStatus) {
        }
    }
    return Controller;
}());
var c = new Controller(MyModel);
Run Code Online (Sandbox Code Playgroud)

  • 我认为打字稿泛型和类静态,特别是当它们组合在一起时,需要彻底检查。你不能对他们做任何事情。 (2认同)