我正在尝试重构一堆重复的代码,而且我已经碰到了一堵墙。我有一堆模型类代表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
然后我再也无法访问静态属性了。我还可以将静态属性设置为实例上的常规属性,但是我需要创建一个实例来使用它 - 在我进行数据库调用之前,我无法创建实例。
看起来这应该是可能的,但我无法弄清楚。
答案 0 :(得分:2)
我猜是
function DBService<T>(Class: { label: string, new (id: number): T }): T {
...
}