在ES2015中枚举通配符导入

时间:2016-07-30 22:56:22

标签: javascript ecmascript-6

因此,在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?

据我所知,spec将此描述为ImportedBinding,但我无法从中推断出更多内容。

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 个答案:

答案 0 :(得分:7)

在这种情况下,规范的重要部分是当你做

import * as foo from 'foo';

foo变量的值在section 15.2.1.16.4 step 12.b处创建,创建Module Namespace Exotic Object,其中properties are the named exportsall properties are enumerable因此您完全安全使用Object.keys(foo)获取所有已命名导出的名称。该对象不可迭代,因此您将无法使用可迭代扩展,但您可以使用建议的对象扩展语法来复制属性(如果需要)。 Object.getOwnPropertyNames也可以正常工作。