模块重新导出无法与对象展开符一起使用

6

我有一个index.js文件,其内容如下:

import aReducer from './ducks/a';
import bReducer from './ducks/b';
import * as aSelectors from './ducks/a';
import * as bSelectors from './ducks/b';

console.log(aReducer) //function i expect
console.log(aSelectors) //object with keys to selectors i expect

export { aReducer, bReducer, ...aSelectors, ...bSelectors };

如果我在这个文件中使用`console.log`,我会发现reducers是我期望的函数,并且选择器别名是带有选择器键的对象。reducer是鸭子文件的默认导出项,而选择器是同一文件的导出项。
然而,当我尝试在另一个文件中导入此模块时,我只能导入两个reducers,而两个选择器则为undefined。我认为解构会将每个键添加到我的导出对象中。我做错了什么?
`other_file1.js`
import { aReducer, bReducer } from 'my-module'; //works!

other_file2.js

import { someSelectorThatWasInMyaSelectorsObject } from 'my-module'; //does NOT work!

export {}; 语句中不能使用 ...。这不会给你一个语法错误吗? - loganfsmyth
没有问题,这不只是导出一个对象吗?我们可以在对象中使用 ... - Turnipdabeets
奇怪,你用什么来处理模块处理? - loganfsmyth
1个回答

6

export {}; 块中,您不能使用 ...。它是一个像 import {name} from 一样的显式名称列表。它不是一个带有导出键的对象。例如,导入方式一样。

import { foo as fooRenamed } from "";

使用export关键字

export {
  fooVar as foo,
};
export块是一个显式的变量列表,其中包含可选的导出名称。这里没有涉及任何对象。

具体来说,没有涉及任何对象,因为在文件主体执行之前,导出名称已经被处理和知道,所以不仅不允许使用对象,而且不可能允许使用对象,因为对象需要执行才能存在。

要获得您想要的结果,应该使用:

// Export the referenced files' default under two specific names.
export { default as aReducer } from './ducks/a';
export { default as bReducer } from './ducks/b';

// Re-export every named export from these two files.
export * from './ducks/a';
export * from './ducks/b';

感谢您的回复。我刚试了一下,但仍然存在同样的问题。:( 当在其他文件中导入时,我能够看到reducers,但任何选择器都是“未定义”的。 - Turnipdabeets
很可能你还有其他问题,不幸的是,如果没有完整的工作示例,我不能提供更多帮助。导致导入值意外变为 undefined 的一个常见原因是可能存在循环依赖,因此当您尝试引用导入的值时,它尚未被分配,但是仅从给出的片段中无法确定是否存在此问题。 - loganfsmyth
你知道吗 - 在尝试添加更多代码并为这个问题编写目录结构之后,我意识到我测试了错误的选择器,因此它自然是未定义的。你的实现可行 - 谢谢! - Turnipdabeets
这很不幸,因为你不能只有一个入口点,而是必须直接引用资源或在索引中重复函数和/或变量引用。例如,使用展开解构的module.exports非常适合在action类型常量、actions等方面具有一个/index.js入口点。 - Ted
我不确定我理解了。 export * from 不会重复名称,而 export {default as X} from 是必须的,因为它一开始就没有名字。 - loganfsmyth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接