typescript - 如何最好地模拟 Typescript 中的命名空间?

标签 typescript ecmascript-6 es6-modules javascript-namespaces

我意识到命名空间在 ES6 中基本上已被弃用,并且在 Visual Code 中效果不佳。

但我还是想用它们。为什么?因为我的代码分布在多个文件中,所以我想在不创建它们之间的依赖关系的情况下对其进行分组。

这是用例。我在不同的文件中有两个不同的商店:

   // fooStore.ts
   class FooStore { numFoos = 0; }

   export const fooStore = new FooStore();

   // barStore.ts
   class BarStore { numBars = 0; }

   export const barStore = new BarStore();

为了便于发现,我想将这些商店组合在一起,以便开发人员可以引用 stores.fooStorestores.barStore

一种解决方案是导出一个包含它们的对象,如下所示:

export const stores = {
  fooStore,
  barStore
};

这是有效的,但它有一个很大的缺点。如果有任何代码引用了 stores.,那么所有引用的存储及其所有依赖项都会被拉入。为什么这是一个问题?因为我在一个代码库中工作,该代码库是 AngularJS 类(遗留代码)和 React/MobX 代码(我们要移植到的代码)的组合,而且我们的一些商店使用 AngularJS。当我编写单元测试或 Storybook 故事时,我不想为我什至不感兴趣的商店设置所有必要的依赖项。

我真正想做的是这样的事情,但我知道不建议这样做。那么我应该怎么做呢?

 // fooStore.ts
 class FooStore { numFoos = 0; }

 namespace Stores {
   export const fooStore = new FooStore();
}

最佳答案

我可以想到 2 种平庸的方法来实现这一点,但它们都有缺点:

1。使用懒惰 getter在访问时加载商店。

const stores = {
  get fooStore () {
    return require("path/to/fooStore");
  }
}

像这样的动态要求可能会影响您的构建步骤。

2。让商店在初始化时向商店的商店注册自己:

export const stores = {};
export class Store {
  constructor(storeName) {
    stores[storeName] = this;
  }
}

这确实需要先加载 FooStore 文件,然后才能在 Store of Stores 上使用。

关于typescript - 如何最好地模拟 Typescript 中的命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67245584/

相关文章:

javascript - Angular 2 和服务单元测试

typescript - 如何在模拟函数时允许部分 TypeScript 类型 - Jest、TypeScript

typescript MyObject.instanceOf()

javascript - 不能在 const 声明中使用 if 语句,但三元运算符有效

javascript - Nodejs 需要类返回 {}

typescript - 在 mac 上构建后在 Electron 应用程序中找不到模块

javascript - 如何处理JSON树?

javascript - 如何知道类的实例是否来自单例?

javascript - 导入值与其导出值断开连接是否仍然是只读的?

node.js - 如何将 d3 v4/v5 模块导入 Node 项目但保持 D3 v3 命名空间样式 (d3.)?