创建具有访问静态属性的通用工厂函数

时间:2016-10-01 19:10:33

标签: angular typescript

我正在尝试重构一堆重复的代码,而且我已经碰到了一堵墙。我有一堆模型类代表Neo4j数据库上不同类型的节点。这些类具有属性static label: string,该属性对应于DB上的节点类型。我想使用此标签,检索节点,然后创建适当类型的实例。

我有类似的东西(这个例子简化)有效:

class record {
    public static label: string;
    public id: number;
}

class RecordType extends record {
    label = "Some_DB_Label";

    constructor(id: number) {
        super()
        this.id = id;
    }

}

function DBService(klass) {
    /*  should work for all record subclasses each with different labels */
    let label = klass.label;

    /* use label to make db query gettig
       getting records of type $label */

    // create objects from returned information
    let id = 10 //<- id from db
    return new klass(id)
}

这方面的javascript方面没有任何问题 - 这段代码运行正常。我可以调用:DBService(RecordType)并获取对象。但是,我正在抛弃所有类型检查。

我想在DBService添加通用类型。我知道我可以在签名中使用构造函数来实现这样的泛型:

function DBServiceG<T>(klass: { new (id: number): T; }): T

然后我再也无法访问静态属性了。我还可以将静态属性设置为实例上的常规属性,但是我需要创建一个实例来使用它 - 在我进行数据库调用之前,我无法创建实例。

看起来这应该是可能的,但我无法弄清楚。

1 个答案:

答案 0 :(得分:2)

我猜是

function DBService<T>(Class: { label: string, new (id: number): T }): T {
  ...
}