无法导入模块的属性

时间:2016-05-13 11:31:26

标签: javascript ecmascript-6

我有一个类似

的模块A.
const defaults = {
   something: {...},
   somethingElse : {...}
}

export { defaults as default };

然后我像

一样导入
import * as mod, { something } from 'moduleA';

mod是一个具有两个声明属性的对象,但{ something }未定义。

任何想法可能是什么原因?

4 个答案:

答案 0 :(得分:2)

  

[使用问题中的模块]我正在导入

import * as mod, { something } from 'moduleA';
     

something未定义

但您的模块中没有名称为something的导出。只有一个包含对象的默认导出。你需要做

import mod from 'moduleA';
const { something } = mod;
  

我有一个类似

的模块A.
const defaults = {
   something: {...},
   somethingElse : {...}
}

export { defaults as default };

但你无论如何都不应该这样做。导出像命名空间一样的“单例”对象是ES6模块中的反模式。您应该使用命名导出:

export const something = {...};
export const somethingElse = {...};

有了这个,你原先尝试导入模块就可以了。

答案 1 :(得分:0)

如果您希望能够在导入中访问命名导出,则必须直接导出它们:

const defaults = {
   something: {...},
   somethingElse : {...}
}

export {
    defaults as default,
    defaults.something as something,
    defaults.somethingElse as somethingElse
};

或者,您可以使用解构来导出somethingsomethingElse

export const { something, somethingElse} = defaults;

然后像你一样导入它:

import * as mod, { something } from 'moduleA';

但是:mod现在将包含道具:defaults, something, somethingElse

如果你只是default(等于你的defaults):

import mod, { something } from 'moduleA';

您可以在Axel Rauschmayr的精彩博文中了解有关ES6导入和导出语法的更多信息:

http://www.2ality.com/2014/09/es6-modules-final.html

答案 2 :(得分:-1)

import * as mod, { something } from 'moduleA';

某些内容未定义的原因是因为当您:export { defaults as default };导出名为default的成员时。当您export {apple, banana}导出成员apple和成员banana时。

导入内容而未指定要导入的成员时,导入名为default的成员。当您指定要导入的成员时,当然要导入它们。

这就是为什么虽然您的代码没有按照您的意图执行,但以下内容将是:

const mod = { something: 'test'};
export { mod as default }; // same as export default mod;

import mod, {default as test} from './index'; // test and mod both have the same values

console.log(mod); // { something: 'test' }
console.log(test.something); // test

答案 3 :(得分:-2)

something未从模块A导出,只有对象defaults

因此,要获得something,您需要从导入的内容中获取它。

import * as mod from 'moduleA';

const something = mod.something;

如果您希望能够像something这样导入import {something} from 'moduleA',则需要明确导出它。例如:

export const something = {};
const somethingElse = {};

export default const defaults = {
  something,
  somethingElse
};