让我们有以下模式:
const mapping:Map<string,Type<A>>=new Map<string,Type<A>>([
["b",B],
["c",C]
])
abstract class A{
var childrenTypes:string[];
var children:A[];
public setupChildren():void{
this.children=this.childrenTypes.map(t=>mapping.get(t).new());
}
}
class B extends A{}
class C extends A{}
这导致循环依赖。将setupChildren方法作为另一个类中的静态方法移动不会破坏循环依赖。
LATER EDIT:该解决方案适用于扩展A的任意数量的类,放在不同的文件中。
答案 0 :(得分:0)
将mapping
声明移到最后?
abstract class A{
childrenTypes: string[]; // not var
children: A[]; // not var
public setupChildren():void{
// there's no method named "new".
// you need ! to ignore the possibly-undefined return value of get(),
// or you need to do a check for the get() result
this.children=this.childrenTypes.map(t=> new (mapping.get(t)!));
}
}
class B extends A{}
class C extends A{ }
// set mapping here
let mapping: Map<string, Type<A>> = new Map<string, Type<A>>([
["b",B],
["c",C]
])
现在它在没有任何东西被使用之前进行编译。 mapping
定义中对setupChildren()
的引用不是问题,因为它在设置mapping
的值之前永远不会运行。
希望有所帮助。