Perché non funziona
import * as MC from './MyClass';
Questa è la import
sintassi in stile ES6 / ES2015 . Il significato esatto di questo è "Prendi l' oggetto spazio dei nomi del modulo caricato da ./MyClass
e usalo localmente come MC
". In particolare, l '" oggetto spazio dei nomi del modulo " consiste solo di un oggetto semplice con proprietà. Un oggetto modulo ES6 non può essere richiamato come funzione o con new
.
Per dirlo di nuovo: un oggetto spazio dei nomi di un modulo ES6 non può essere richiamato come funzione o con new
.
La cosa che import
usi * as X
da un modulo è definita per avere solo proprietà. In CommonJS di livello inferiore questo potrebbe non essere pienamente rispettato, ma TypeScript ti dice qual è il comportamento definito dallo standard.
Cosa funziona?
Dovrai utilizzare la sintassi di importazione in stile CommonJS per utilizzare questo modulo:
import MC = require('./MyClass');
Se controlli entrambi i moduli, puoi utilizzare export default
invece:
MyClass.ts
export default class MyClass {
constructor() {
}
}
MyConsumer.ts
import MC from './MyClass';
Sono triste per questo; Le regole sono stupide.
Sarebbe stato bello usare la sintassi di importazione di ES6, ma ora devo fare questa import MC = require('./MyClass');
cosa? È così 2013! Noioso! Ma il dolore è una parte normale della programmazione. Salta alla fase cinque nel modello Kübler-Ross: Accettazione.
TypeScript qui ti sta dicendo che questo non funziona, perché non funziona. Ci sono hack (l'aggiunta di una namespace
dichiarazione a MyClass
è un modo popolare per fingere che funzioni ), e potrebbero funzionare oggi nel tuo particolare bundler di moduli di livello inferiore (es. Rollup), ma questo è illusorio. Non ci sono ancora implementazioni di moduli ES6 in circolazione, ma non sarà vero per sempre.
Immagina il tuo sé futuro, provando a eseguire su un'implementazione del modulo ES6 nativo e scoprendo che ti sei preparato per un grave fallimento cercando di utilizzare la sintassi di ES6 per fare qualcosa che ES6 non fa esplicitamente .
Voglio sfruttare il mio caricatore di moduli non standard
Forse hai un caricatore di moduli che "utilmente" crea default
esportazioni quando non ne esistono. Voglio dire, le persone fanno degli standard per un motivo, ma ignorare gli standard a volte è divertente e possiamo pensare che sia una cosa interessante da fare.
Cambia MyConsumer.ts in:
import A from './a';
E specifica la allowSyntheticDefaultImports
riga di comando o l' tsconfig.json
opzione.
Nota che allowSyntheticDefaultImports
non cambia affatto il comportamento di runtime del tuo codice. È solo un flag che dice a TypeScript che il caricatore di moduli crea default
esportazioni quando non esistono. Magicamente non farà funzionare il tuo codice in nodejs quando non lo faceva prima.
javascript
come tag principale e di lasciarloecmascript-6
, perché il tag principale qui ètypescript
. La domanda presume erroneamente cheexport =
(una funzione TS) possa essere accoppiataimport ... from
, mentre dovrebbe essere accoppiata conimport =
. È fondamentalmente l'importazione / esportazione del modulo ES6 rispetto a CJS / AMD.