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

标签 class generics typescript static abstract

我有一个抽象类 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 的每个遗产并实现一个方法来检索值?

最佳答案

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);

关于class - Typescript 访问泛型类型的静态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41089854/

相关文章:

arrays - 为什么数组不符合 Equatable,而它的项在 Swift 中是 Equatable 的?

typescript - 使用参数调用对象的成员

typescript - 如果 npm 或 yarn 存在于 Typescript 项目中,它们是否具有自动安装 @types 的功能?

c++ - 如何解决特定的循环依赖?

javascript - Node.js:在另一个自定义类中引用自定义类

ruby - 如何在 Ruby 中实现私有(private)内部类

javascript - React、Typescript 项目中 merge 冲突如何有效

c - C 代码有问题

java - 获取对象所有成员的字段和数据类型

java - 接口(interface)内的泛型方法