如何最好地模拟Typescript中的名称空间?
我意识到名称空间在ES6中基本上是不推荐的,并且在可视化代码中不能很好地工作 但我还是想用它们。为什么?因为我的代码分布在多个文件中,我希望对这些文件进行分组,而不在它们之间创建依赖关系 下面是用例。我在不同的文件中有两个不同的存储:如何最好地模拟Typescript中的名称空间?,typescript,ecmascript-6,es6-modules,javascript-namespaces,Typescript,Ecmascript 6,Es6 Modules,Javascript Namespaces,我意识到名称空间在ES6中基本上是不推荐的,并且在可视化代码中不能很好地工作 但我还是想用它们。为什么?因为我的代码分布在多个文件中,我希望对这些文件进行分组,而不在它们之间创建依赖关系 下面是用例。我在不同的文件中有两个不同的存储: // fooStore.ts class FooStore { numFoos = 0; } export const fooStore = new FooStore(); 及 出于可发现性的目的,我想将这些商店分组,以便开发人员可以参考st
// fooStore.ts
class FooStore { numFoos = 0; }
export const fooStore = new FooStore();
及
出于可发现性的目的,我想将这些商店分组,以便开发人员可以参考stores.fooStore
和stores.barStore
一种解决方案是导出一个同时包含它们的对象,如下所示:
export const stores = {
fooStore,
barStore
};
这是可行的,但也有很大的缺点。如果任何代码引用了存储。
则所有引用的存储及其所有依赖项都将被拉入。为什么这是一个问题?因为我在一个代码库中工作,它是AngularJS类(遗留代码)和React/MobX代码(我们要移植到的代码)的组合,我们的一些商店使用AngularJS。当我编写单元测试或故事书时,我不想为我甚至不感兴趣的存储设置所有必要的依赖项
我真的很想做这样的事情,但我明白这是不建议的。那么我应该怎么做呢
// fooStore.ts
class FooStore { numFoos = 0; }
namespace Stores {
export const fooStore = new FooStore();
}
我可以想出两种平庸的方法来实现这一点,但它们都有缺点: 1.在访问存储时使用lazy命令加载存储。
const存储={
获取fooStore(){
返回要求(“路径/目的地/商店”);
}
}
这样的动态需求可能会影响构建步骤
2.让门店在初始化时向门店门店注册:
export const stores={};
出口类商店{
构造函数(storeName){
stores[storeName]=这个;
}
}
这确实需要先加载FooStore
文件,然后才能在存储区中使用它
一种解决方案是导出包含它们的对象
是的,这会导致问题,因为它需要拉入依赖项,以便将存储实例放入对象中。相反,请使用具有命名导出的模块:
// stores/index.ts
export { fooStore } from './fooStore.ts';
export { barStore } from './barStore.ts';
然后,您可以使用名称空间导入来对它们进行分组:
import * as stores from 'stores';
console.log(stores.fooStore.numFoos);
这仍然允许树抖动-上面的模块不引用
stores.barStore
,因此不需要加载该模块(即使它被声明为依赖项)。我认为这正是我要寻找的。还有一个问题:您知道嵌套名称空间的方法吗?也就是说,stores.app.fooStore
etc?理论上你可以export{stores}代码>作为名称空间导入后,并以此构建嵌套对象,但我不确定绑定器/加载程序对此支持树扫描的程度。
import * as stores from 'stores';
console.log(stores.fooStore.numFoos);