使用打字稿对 angular 模块的循环依赖

Circular dependencies on angular modules using typescript

我遇到了这个问题,我有 2 个 angular 1.5 模块相互依赖,angularjs 没问题,但是当我使用 typescript 和 webpack 导入它们时,我获取循环 typescript-module 依赖项并且模块未正确加载。 我在模块之间的 angular 服务中没有循环依赖,因此相互依赖 angular 模块应该没有问题。

//first.module.ts
import {SecondModule} from "second.module.ts";
let FirstModule = angular.module("firstModule",[SecondModule.name]);
export {FirstModule};

//second.module.ts
import {FirstModule} from "first.module.ts";
let SecondModule = angular.module("secondModule",[FirstModule.name]);
export {SecondModule};

在上面的示例中,我在最后一行得到 "cannot get 'name' of undefined",因为 FirstModule 尚未导出。

我在网上看到的一个解决方案就是不将 SecondModule 定义为 FirstModule 的依赖项,而是让它们成为父模块(我的主应用程序模块)的依赖项,问题是我无法使用 ngMock 模拟 FirstModule单元测试 - 因为它没有将 SecondModule 注册为依赖子模块。所以我必须模拟我的整个主要应用程序,它又大又乱。

我看到的其他解决方案是用打字稿 classes 包装 angular 模块,并将 angular 模块创建放入此 class 的构造函数中,所以我可以控制何时创建模块,但是我必须重构我的整个应用程序来创建那些包装模块的对象,我不知道这将如何影响使用 ngMock 编写单元测试。

对于这种情况有什么最佳实践吗?

谢谢!

您可以将字符串常量导出为文件中的第一个内容

//first.module.ts
export const prefixFirstModule = "prefixFirstModule";
import {prefixSecondModule} from "second.module";
export const FirstModule = angular.module(prefixFirstModule,[prefixSecondModule]);

//second.module.ts
export const prefixSecondModule = "prefixSecondModule";
import {prefixFirstModule} from "first.module";
export const SecondModule = angular.module(prefixSecondModule,[prefixFirstModule]);

这有点麻烦,但据我所知,这是解决问题的唯一方法,同时支持与当前模块结构相同的 tree shaking 等。