因此,在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.
答案 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 exports和all properties are enumerable因此您完全安全使用Object.keys(foo)
获取所有已命名导出的名称。该对象不可迭代,因此您将无法使用可迭代扩展,但您可以使用建议的对象扩展语法来复制属性(如果需要)。 Object.getOwnPropertyNames
也可以正常工作。