Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何最好地模拟Typescript中的名称空间?_Typescript_Ecmascript 6_Es6 Modules_Javascript Namespaces - Fatal编程技术网

如何最好地模拟Typescript中的名称空间?

如何最好地模拟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

我意识到名称空间在ES6中基本上是不推荐的,并且在可视化代码中不能很好地工作

但我还是想用它们。为什么?因为我的代码分布在多个文件中,我希望对这些文件进行分组,而不在它们之间创建依赖关系

下面是用例。我在不同的文件中有两个不同的存储:

   // 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);