Typescript类属性在构造函数中初始化,而在成员函数中未定义

时间:2018-12-16 12:37:33

标签: typescript electron eventemitter

我一直反复遇到相同的问题。我正在使用Typescript创建电子应用程序。我有一组后端控制器。 AppController对与文件系统的交互具有管辖权。 WindowController拥有所有基本窗口功能的管辖权。这是代码的简化版本:

AppController.ts

export class AppController {

  windowCtrl: WindowController

  constructor() {
    this.windowCtrl = new WindowController(Init Details);

    this.windowCtrl.windowEvents.on('window:get-parent-directory',
    () => {
      console.log('made it here');
    });
  }
}

WindowController.ts

export class WindowController {

  public windowEvents: EventEmitter;

  constructor(Init Details) {
    this.windowEvents = new EventEmitter();
    // this.windowEvents is defined here.
    ipcMain.on('get-parent', getParentDirecotry);
  }

  getParentDirectory() {
    this.windowEvents.emit('window:get-parent-directory');
    // this.windowEvents is undefined here
  }
}

事件发射器 windowEvents 通过消息在两个类之间进行通信。我已经使用Angular中的EventEmitters完成了同样的事情,并且通读了节点文档以确保没有犯一个愚蠢的错误。我已经做了很多研究,但是我发现的只是人们没有在构造函数中初始化它的例子。我没有选择权,也不知道我缺少什么。电子出现的BrowserWindow实例也发生了同样的问题。我在构造函数中对其进行了初始化,该窗口在屏幕上打开,并且当我尝试从该类的成员函数中调用它时,它是未定义的。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果您确定自己的代码正确无误,但undefined却是毫无原因的,则可能是因为您遇到了循环依赖问题。

您用来构建项目的工具可能已经找到了两个模块,它们直接或间接地相互依赖。要解决这种情况,它必须从某处开始,但是要暂时将一个模块标记为undefined

您可以使用静态分析来验证是否是这种情况。如果您使用的是TSLint,则tslint-no-circular-imports规则提供了这一点。还有一个Webpack plugin做同样的事情。