【发布时间】:2020-10-28 06:54:27
【问题描述】:
早上好,
问题
我正在使用 Typescript 创建一个 Angular 应用程序。我想创建一个采用类型参数并将其传递给工厂以使用 cTor 创建新实例的方法。如果我知道类型,那效果很好,但如果我不知道,那就不行了。例如这有效(第 4 行):
list<T extends IMdmObject>(page = 1, pageSize = 50) {
this.http.get<T[]>(this.uri).pipe(tap(
_mdmObject => {
let _ = _mdmObject.map(x => this.createInstance<MdmCountry>(MdmCountry, x));
this.mdmStoreController.dispatch(this.ressource, _mdmObject, StoreAction.MERGE);
}
)).subscribe();
}
createInstance<T extends AbstractMdmStorable>(concrete: new(mdmObject: IMdmObject) => T, init: IMdmObject): T {
return new concrete(init);
}
但如果我使用 T 代替它,它就不起作用:
list<T extends IMdmObject>(page = 1, pageSize = 50) {
this.http.get<T[]>(this.uri).pipe(tap(
_mdmObject => {
let _ = _mdmObject.map(x => this.createInstance<T>(T, x));
this.mdmStoreController.dispatch(this.ressource, _mdmObject, StoreAction.MERGE);
}
)).subscribe();
}
createInstance<T extends AbstractMdmStorable>(concrete: new(mdmObject: IMdmObject) => T, init: IMdmObject): T {
return new concrete(init);
}
我知道 Typescript 将代码转换为 js 并且 T 在该进程之后不可用。但是有没有办法创建一个扩展 AbstractMdmStorable 的通用实例?
备注
- AbstractMdmStorable 实现 IMdmObject
- MdmCountry 扩展 AbstractMdmStorable
【问题讨论】:
标签: javascript typescript generics factory