在ES2015中枚举通配符导入

7

因此,在ES2015中,您可以拥有:

// Module A
export const FOO = 0;
export const BAR = 1;

// Module B
import * as AExports from 'ModuleA';
console.log(AExports.FOO); // Prints 0

在运行时枚举ModuleA的导出方式是什么?

import * as AExports from 'ModuleA';
// Are these values guaranteed to be something?
Object.keys(AExports); // If so, should I look at enumerable values?
[...AExports]; // Iterable values?
Object.getOwnPropertyNames(AExports); // Here?

据我所知,规范将其描述为“导入绑定”,但我无法从中得出更多信息。
NameSpaceImport : * as ImportedBinding
Let localName be the StringValue of ImportedBinding.
Let entry be the Record {[[ModuleRequest]]: module, [[ImportName]]: "*", [[LocalName]]: localName }.
Return a new List containing entry.
1个回答

10

在这种情况下,规范的重要部分是当你执行操作时

import * as foo from 'foo';

foo变量的值是在第15.2.1.16.4节的12.b步骤中创建的,该步骤创建了一个模块命名空间奇异对象,其中属性是命名导出项所有属性都是可枚举的,因此您可以放心使用Object.keys(foo)来获取所有命名导出项的名称。该对象不可迭代,因此您将无法使用可迭代扩展符,但如果需要,可以使用提议的对象扩展语法来复制属性。Object.getOwnPropertyNames也可以正常工作。


谢谢提供额外的链接,它们让我更容易理解下次的规范。 - AnilRedshift

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