Dattiloscritto: impossibile utilizzare l'istruzione import all'esterno di un modulo


19

Ho un file .ts nell'applicazione js del nodo (ultima versione di node.js per il 07.10.19) con l'importazione del modulo nodo senza esportazione predefinita. Io uso questa costruzione: import { Class } from 'abc';Quando eseguo il codice, ho questo errore: Cannot use import statement outside a module.

Nella rete vedo molte soluzioni per questo problema (per .js), ma non mi aiuta, forse perché ho un file dattiloscritto. Ecco il mio codice:

import { Class } from 'abc';
module.exports = { ...
    execute(a : Class ,args : Array<string>){ ...

Ecco il mio tsconfig.json:

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",

    "strict": true
  }
}

Lo stai eseguendo in un browser? L' importistruzione è la prima riga del tuo file?
Evert

1
Puoi per favore pubblicare il tuo file tsconfig.json? Quando si compila in Typescript, è possibile determinare quale tipo di moduli produce e i tipi validi possono differire a seconda dell'ambiente (browser / NodeJS) e degli altri moduli ( requirevs import) che si utilizzano. Giusto per darti un'idea di quanto sia complicato, Node ha una documentazione su importvs requiree su come farli lavorare insieme.
Jeff Bowman,

1
Se si utilizza la module.exportssintassi, probabilmente non ci si trova in un modulo ES6.
Bergi,

Evert, questa è l'app js del nodo, tsconfig verrà aggiunto presto
Zerumi

Ok, non posso usare il requisito perché Impossibile trovare lo spazio dei nomi 'abc' quando si utilizza la costruzioneexecute(a : abc.Class...
Zerumi

Risposte:


5

L'aggiunta “type”: “module”a package.json indicherà a Node che si stanno utilizzando i moduli ES2015, che dovrebbero eliminare l'errore, ma sarà quindi necessario dire a Typescript di generare questo tipo di modulo impostando “module”: “es2015”invece che “commonjs”in tsconfig.json.

Ciò tuttavia causa un problema con il codice corrente poiché, sebbene si stia utilizzando un'istruzione ES6 import {}, si esporta utilizzando la module.exports = {}sintassi commonJS e il caricatore del modulo ES del nodo avrà un problema con esso. Esistono due modi per gestirlo:

  1. Conservare module.exportsma dire a Node di interpretare questo file come commonJS dandogli un'estensione .cjs .
  2. Cambia la dichiarazione di esportazione in sintassi ES2015: export function execute(…)..

La prima opzione potrebbe diventare un po 'complicata perché il compilatore produrrà file .js e dovresti cambiarlo in .cjs tutto il tempo (per quanto ne so). Con la seconda opzione dovresti essere in grado di eseguire il file con Node (incluso il flag --experimental-modules per le versioni <13.8).

Se hai assolutamente bisogno di usare commonJS, forse è meglio installare le definizioni dei tipi per Node: @ types / node e cambiare l'importazione nel formato commonJS: require('abc')e mantenere le altre impostazioni così come sono (anche se puoi aggiungere "type" : “Commonjs” in package.json per essere esplicito).


1
richiedono ('abc'). La classe non può essere utilizzata nelle definizioni .ts (come una: Class) ... Informazioni sull'estensione .cjs ... I tipi possono essere solo nei file .ts ... ES2015 non è la mia scelta perché uso questo modulo con vecchio importazione (richiede) ovunque ... Ho risolto questo problema usando JSDoc. Ma grazie per la risposta
Zerumi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.