2016-11-08 1 views
0

Ich schreibe einen Code, den ich nur auf den Token von import * as name from 'module-name' Syntax anwenden möchte.Erkennen von `import * als Name` Token

Gibt es eine Möglichkeit, das zu tun? Ich erinnere mich, dass es eine __ESModule Flagge oder etwas Ähnliches gibt, aber das ist nicht in der offiziellen Spezifikation, also bin ich nicht sicher, ob das der richtige Ansatz ist (und ich kann den genauen Artikel nicht finden, der darüber spricht, wäre ein Hinweis von tolle Hilfe).

heißt das ist, was ich will (mit Typoskript im Beispiel):

import * as someModule from 'module-name' 
import someDefault from 'module-name' 
import { someNamed } from 'module-name' 
import otherImport = require('cjs-module') 

let somethingElse = {} // anything 
checkIsStarModule(someModule) // true 
checkIsStarModule(someDefault) // false 
checkIsStarModule(someNamed) // false 
checkIsStarModule(otherImport) // false 
checkIsStarModule(somethingElse) // false 

Und was ist der richtige Name import * as name ... Syntax zu beschreiben? :)

EDIT: Hinzufügen eines Kontexts zu der Frage.

Ich mache so etwas wie aurelia 's FrameworkConfiguration.

Und ich möchte es nur auf someModule wie oben beschrieben anwenden. Das liegt daran, dass ich die Methode configure() nicht versehentlich auf etwas ausführen möchte, das kein Modul ist.

Meine API ist get(key: Newable<T> | T): Promise<T> und ich erlaube es den Verbrauchern, in alles einwerfen, wie key (Newable<T> ist einfach jede Klasse).

Dank @estus auf __esModule, und ich erkenne, dass es nur für Interop ist daher nicht in diesem Zusammenhang nützlich.

+0

Welchen Zweck sollte diese Überprüfung erfüllen? '__esModule' ist der Weg, wie der ES6-Import erkannt werden kann. – estus

+1

Was willst du, wenn ein Modul 'Foo importieren von './Foo'; Export {Foo}; '? Wenn Sie dann 'Foo} aus './index';' importieren, wäre das 'Foo'-Objekt ein Import mit einem Stern, aber nicht aus der aktuellen Datei. Es würde wahrscheinlich helfen, mehr über den Anwendungsfall zu wissen, den Sie tatsächlich zu lösen versuchen. – loganfsmyth

+0

@loganfsmyth, das wäre in Ordnung. Genau das habe ich erwartet und gesucht. – unional

Antwort

0

Es gibt nichts, was module namespace objects wirklich von anderen unterscheidet, jeder könnte ein solches Objekt erstellen. Sie können

function isModuleNamespaceLike(o) { 
    return o === Object(o) 
    && o[Symbol.toStringTag] === "Module" 
    && Object.getPrototypeOf(o) === null 
    && !Object.isExtensible(o) 
    && Object.getOwnPropertyNames(o).every(function(p) { 
     var d = Object.getOwnPropertyDescriptor(o, p); 
     return d.enumerable && !d.configurable; 
    }); 
} 

für testen oder versuchen, für __esModule zu suchen, aber das hängt von Ihren Transpiler.

+2

Alternativ in ES6 'Object.prototype.toString.call (obj) ===" [object Module] "' wenn es Ihnen nichts ausmacht, dass toStringTag für misc-Objekte überschrieben werden kann. – loganfsmyth

+0

@loganfsmyth Oh, richtig, wie konnte ich [das] vermissen (http://www.ecma-international.org/ecma-262/6.0/#sec-module-namespace-objects)! Ich frage mich, ob 'o [Symbol.iterator]' auf allen Modulnamensraumobjekten die gleiche Identität hat ... – Bergi

+0

Danke. Wie @loganfsmyth Antwort auch. Ich werde es einfach halten und sehen, wie es sich entwickelt. Vielen Dank. – unional