ES6:使用命名空间

时间:2018-02-22 19:46:14

标签: ecmascript-6 es6-modules

我不时想做一件具体的事情,我无法弄清楚:

假设module1.js导出3个值:

//module1.js

export const a = 'a';
export const b = 'b';
export const c = 'c';

然后,在module2.js中,我想将两个导入到一个对象中(作为一种命名空间):

//module2.js

import { a, c } as constants from './module1'; //<-WRONG!

所以我最终做的就是这样:

//module2.js

import { a, c } from './module1';
const constants = { a, c };

这样做有效,但现在ac都存在于constants中,也直接存在于模块范围内。

有没有办法避免这种情况?

2 个答案:

答案 0 :(得分:3)

你的意思是

import * as constants from './module1';

如果您需要传递它们,也可以删除一些,例如lodash pick

const cleanConstants = _.pick(['a', 'c'], constants);

答案 1 :(得分:2)

根据MDN documentation,您可以在整个模块内容(例如* as constants)或单个内容(例如b as constants)上设置别名。但是您无法在特定内容上设置别名。因此,其中一个解决方案是使用*。

import * as constants from './module1';

另一种可能的解决方案是将{ a, c }作为默认值传递。

//module1.js

export const a = ...
export const b = ...
export const c = ...
export const d = ...
export default { a, b, c };

/module2.js
import contants from './someModule';
doStuff(constatns);

最后,如果您不想将这些常量作为默认值传递,则可以创建一个对象并传递该对象。

//module1.js

export const a = ...
export const b = ...
export const c = ...
export const b = ...
export const myCustomConstants = { a, c };

//module2.js
import { myCustomConstants } from './someModule';
doStuff(myCustomConstants);