2016-07-30 9 views
4

also in ES2015 können Sie haben:Aufzählen Wildcard Importe in ES2015

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

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

Was ist der offizielle Weg, um die Ausfuhr von ModuleA zur Laufzeit aufzuzählen?

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? 

Soweit ich das beurteilen kann, beschreibt die spec dies als ImportedBinding aber ich kann nichts mehr aus, dass ableiten.

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. 

Antwort

5

Der wichtige Teil der Spezifikation in diesem Fall ist, dass, wenn Sie

import * as foo from 'foo'; 

Der foo Variablenwert bei section 15.2.1.16.4 step 12.b tun erstellt wird, die ein schafft, wo properties are the named exports und all properties are enumerable, so dass Sie absolut sicher sind Verwenden Sie Object.keys(foo), um die Namen aller genannten Exporte zu erhalten. Das Objekt ist nicht iterierbar, Sie können also keinen iterierbaren Spread verwenden, obwohl Sie die vorgeschlagene Objektspreizsyntax verwenden könnten, um die Eigenschaften zu kopieren, wenn Sie dies wünschen. Object.getOwnPropertyNames sollte auch gut funktionieren.

+0

Danke auch für die zusätzlichen Links - Sie haben es leichter gemacht, die Spezifikation für das nächste Mal zu verstehen. – AnilRedshift