【问题标题】:How to cross import TypeScript classes?如何交叉导入 TypeScript 类?
【发布时间】:2019-04-15 10:39:35
【问题描述】:

我正在尝试将 JavaScript 代码重写为 TypeScript,但在尝试将类导入不同的 TypeScript 文件时遇到了一些问题。

这曾经是用 jQuery 命名空间来完成的,它工作得很好。

我的情况是:

文件布局:

import { Commands } from './funnel.commands'
var commands = new Commands(); /*<--- problematic line*/

export class Layouts {

    loadHtmlSubLayout(done: Function, layoutname: string): void {
    /*...*/
        commands.CloseSubLayout();
    /*...*/
    };

    closeSubLayout(layoutContent): void {
    /*...*/
    };


}

文件命令:

import { Layouts } from './funnel.layouts'
var layouts = new Layouts();

export class Commands {

    GotoLayout(el, cmd: CommandObj): void {
       /*...*/
        layouts.loadSpecificLayout(layouts.onLayoutSwitched, layoutName);
    };
    CloseSubLayout(): void {
    /*...*/
        if ($subLayoutContent.length !== 0) {
          layouts.closeSubLayout($subLayoutContent);
        }
    };
}

每当我尝试运行它时,都会收到错误消息“命令不是构造函数”。我怎样才能确保它在不移动方法的情况下有效?

【问题讨论】:

  • 你在 B 中导入 A,在 A 中导入 B……你以上帝的名义在做什么?
  • 这不是我的原始代码,幸好我只是为公司重写它,显然示例被简化了,但是使用 jQuery 版本有点意义
  • @HagelslagPakje 我错了,循环 dep 导致运行时出现问题。
  • 是的,就像我已经说过的,这与一个类导入另一个类的事实有关,反之亦然,只需要一些帮助来修复它而不移动所有代码
  • @HagelslagPakje 这也可以使用 TS 命名空间来解决。但是你想怎么用这些来归档呢?如果你打算使用严格的模块,那么必须做一些重构。

标签: javascript typescript import export


【解决方案1】:

这两个模块中的一个必须回退并使用异步/延迟初始化另一个以中断循环导入链。

在您的示例中,我假设 CommandsLayouts 之前使用。因此,您可以执行以下操作:

文件funnel.commands

import { Layouts } from './funnel.layouts'
var layouts = new Layouts

export class Commands {
  CloseSubLayout(): void {
    layouts.closeSubLayout({});
  };
}

文件funnel.layouts

import { Commands } from './funnel.commands'
var commands: Commands
setTimeout(() => {
  commands = new Commands()
})

export class Layouts {
  loadHtmlSubLayout(): void {
    commands.CloseSubLayout();
  };

  closeSubLayout(layoutContent): void {
    console.log('You just called Layouts.closeSubLayout()')
  };
}

另一方:

import { Commands } from './funnel.commands'

var commands = new Commands()

commands.CloseSubLayout()

上述解决方案应该可行,但循环依赖仍然是一种反模式。由于您正在重写代码库,因此最好重构该部分。我建议使用某种依赖注入模式。

文件dependencies

export const dependencies: any = {
  _register(map: any) {
    Object.assign(this, map)
  }
}

文件funnel.commands

import { dependencies as dep } from './dependencies'

export class Commands {
  CloseSubLayout(): void {
    dep.layouts.closeSubLayout({});
  };
}

文件index

import { Commands } from './funnel.commands'
import { Layouts } from './funnel.layouts'
import { dependencies } from './dependencies'

var commands = new Commands()
var layouts = new Layouts()
dependencies._register({ commands, layouts })

【讨论】:

  • 这是解释依赖注入的好方法!
  • 我必须在哪里声明/导入索引(index.ts)?需要导入吗?
猜你喜欢
  • 1970-01-01
  • 2021-02-13
  • 2021-04-07
  • 2017-12-03
  • 2011-02-26
  • 1970-01-01
  • 2016-03-12
  • 2017-11-28
  • 2020-01-03
相关资源
最近更新 更多