我有一个类似
的模块A.const defaults = {
something: {...},
somethingElse : {...}
}
export { defaults as default };
然后我像
一样导入import * as mod, { something } from 'moduleA';
mod
是一个具有两个声明属性的对象,但{ something }
未定义。
任何想法可能是什么原因?
答案 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
};
或者,您可以使用解构来导出something
和somethingElse
:
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导入和导出语法的更多信息:
答案 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
};