解构默认导出对象

IT技术 javascript es6-modules
2021-01-13 06:40:03

我可以在导入时解构默认导出对象吗?

鉴于以下导出语法 ( export default)

const foo = ...
function bar() { ... }

export default { foo, bar };

以下导入语法是否有效 JS?

import { foo, bar } from './export-file';

我问是因为它在我的系统上工作,但我被告知它不应该根据规范工作。

2个回答

我可以在导入时解构默认导出对象吗?

不可以。您只能在将对象导入变量后对其进行解构。

请注意,导入/导出具有与对象文字/对象模式完全不同的语法和语义。唯一的共同点是两者都使用大括号,并且它们的速记表示(只有标识符名称和逗号)是无法区分的。

以下导入语法是否有效 JS?

import { foo, bar } from './export-file';

是的。它确实从module中导入了两个命名的导出。这是一个简写符号

import { foo as foo, bar as bar } from './export-file';

这意味着“声明一个绑定foo并让它引用以foofrom名称导出的变量export-file,并声明一个绑定bar并让它引用以barfrom名称导出的变量export-file”。

鉴于以下导出语法(导出默认值)

export default { foo, bar };

上述导入是否适用于此?

。它所做的是声明一个不可见的变量,用 object 初始化它{ foo: foo, bar: bar },然后以 name 导出它default
当这个module被导入为时export-file,名称default将不会被使用,名称foobar将不会被找到,这会导致一个SyntaxError.

要解决此问题,您需要导入默认导出的对象:

import { default as obj } from './export-file';
const {foo: foo, bar: bar} = obj;
// or abbreviated:
import obj from './export-file';
const {foo, bar} = obj;

或者您保留导入语法,而是使用命名导出:

export { foo as foo, bar as bar };
// or abbreviated:
export { foo, bar };
// or right in the respective declarations:
export const foo = …;
export function bar() { ... }
他的默认导出语句是使用速记语法创建对象文字,他导出单个对象就像导出命名导出向对象添加属性一样。导入语句是正确的。你的答案是错误的。
2021-03-18 06:40:03
我读过无数次“默认导出受到青睐”并提供更简单的语法。但是不需要导入默认对象然后解构内容,与该声明背道而驰吗?
2021-03-24 06:40:03
ImportEntries由出口决定。从而导入创建另一个List以容纳条目。您不能导入尚未导出的内容,这种关系是由导出而不是导入语句定义的。
2021-03-29 06:40:03
@sfletche 是的,这种说法是错误的。当您有多个变量时,命名导出是首选。当只有一个主要值要导出(例如一个类)时,才支持默认导出。默认导出具有更简单的语法,因为它们经常被需要,而不是因为它们通常受到青睐。
2021-03-31 06:40:03
名称无关紧要。数据结构是唯一相关的东西。符号表示List返回 a。正如我所说,你反对。
2021-04-01 06:40:03

我可以在导入时解构默认导出对象吗?

是的,使用动态导入

要添加解决静态导入的 Bergi 答案,请注意,在动态导入的情况下,由于返回的module是一个对象,您可以使用解构赋值来导入它:

(async function () {
  const { default: { foo, bar } } = await import('./export-file.js');
  console.log(foo, bar);
})();

为什么这有效

import在不同的上下文中操作有很大的不同。当在module的开头使用时,在 format 中import ... from ... ,它是一个静态 import,它具有在 Bergi 的回答中讨论的限制。

当在表单中的程序内部使用时import('./filename.js'),它被认为是动态导入动态导入的操作非常类似于解析为对象的函数(作为命名导出和分配给default属性的默认导出的组合),并且可以这样解构。

在提问者的例子中,await import('./export-file.js')将解析为:

{
  default: {
    foo: ...,
    bar: function bar() {...}
  }
}

从这里开始,您可以使用嵌套解构直接分配foo, 和bar

const { default: { foo, bar } } = await import('./export-file.js');
更新了我的答案
2021-03-14 06:40:03
你能解释一下这是如何工作的吗?
2021-03-17 06:40:03
谢谢!现在更有意义了!
2021-03-22 06:40:03