【问题标题】:Typescript module behaviour打字稿模块行为
【发布时间】:2016-05-13 15:49:38
【问题描述】:

在下面的模块 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 建议我的代码应该可以工作,但事实并非如此。为什么?我该怎么办?

【问题讨论】:

    标签: typescript


    【解决方案1】:

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

    然而,基类并不要求与工厂在同一个文件中,这只是开发的一个意外。将模块拆分为 三个 文件允许按依赖顺序加载:

    1. 基类和核心派生类
    2. 基类的插件派生类
    3. 工厂

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

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 2015-05-01
      • 2016-06-22
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-27
      • 2016-05-24
      相关资源
      最近更新 更多