Typescript模块行为

时间:2016-02-04 06:39:55

标签: typescript

在以下模块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 { }

}

由于某种原因,WidgetGreenfactoryMethod内的运行时超出了范围。将它移动到同一个文件可以解决问题,但这对于插件类来说并不好 - 它们必须添加到同一个文件中。

This question表明我的代码应该有效,但事实并非如此。为什么?我该怎么办呢?

1 个答案:

答案 0 :(得分:0)

问题是必须先加载基类,然后必须最后加载工厂。将基类和工厂放在同一个文件中是不可能的。

但是,基类不需要与工厂在同一个文件中,这只是一个发展事故。将模块拆分为三个文件允许按依赖顺序加载:

  1. 基类和核心衍生物
  2. 基类的插件衍生物
  3. 更好的方法是使用集合和RegisterType方法装饰基类,该方法接受类引用并将其与数据类型字符串名称相关联。每个类声明都可以跟随该类的注册。工厂成为基类的静态方法,可以访问已注册类型的集合。这种方法稍微复杂一些,但更容易维护,对库代码的用户提出的要求更少。