在以下模块foo中,bar.factoryMethod('Blue')
返回WidgetBlue
的实例。
module foo {
export class bar {
factoryMethod(classname: string): WidgetBase {
return new foo["Widget" + classname]();
}
}
export class WidgetBase {
A: number;
B: string;
}
export class WidgetBlue extends WidgetBase { }
export class WidgetRed extends WidgetBase { }
}
这种安排很有效,是插件小部件。
不幸的是,当我在另一个文件中声明插件WidgetGreen
时,事情会迅速向南移动。
module foo {
export class WidgetGreen extends WidgetBase { }
}
由于某种原因,WidgetGreen
在factoryMethod
内的运行时超出了范围。将它移动到同一个文件可以解决问题,但这对于插件类来说并不好 - 它们必须添加到同一个文件中。
This question表明我的代码应该有效,但事实并非如此。为什么?我该怎么办呢?
答案 0 :(得分:0)
问题是必须先加载基类,然后必须最后加载工厂。将基类和工厂放在同一个文件中是不可能的。
但是,基类不需要与工厂在同一个文件中,这只是一个发展事故。将模块拆分为三个文件允许按依赖顺序加载:
更好的方法是使用集合和RegisterType方法装饰基类,该方法接受类引用并将其与数据类型字符串名称相关联。每个类声明都可以跟随该类的注册。工厂成为基类的静态方法,可以访问已注册类型的集合。这种方法稍微复杂一些,但更容易维护,对库代码的用户提出的要求更少。