Typoskript: Importanweisung kann nicht außerhalb eines Moduls verwendet werden

19

Ich habe eine .ts-Datei in der App Node Js (neueste Version von Node.js für den 07.10.19) mit dem Import des Node-Moduls ohne Standardexport. Ich benutze diese Konstruktion: import { Class } from 'abc';Wenn ich den Code ausführe, habe ich diesen Fehler : Cannot use import statement outside a module.

Im Netzwerk sehe ich viele Lösungen für dieses Problem (für .js), aber es hilft mir nicht, vielleicht weil ich eine Typoskriptdatei habe. Hier ist mein Code:

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

Hier ist meine tsconfig.json:

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

    "strict": true
  }
}
Zerumi
quelle
Führen Sie dies in einem Browser aus? Ist die importAnweisung die erste Zeile in Ihrer Datei?
Evert
1
Können Sie bitte Ihre tsconfig.json-Datei veröffentlichen? Wenn Sie in Typescript kompilieren, können Sie bestimmen, welchen Modultyp es erzeugt, und die gültigen Typen können je nach der von Ihnen verwendeten Umgebung (Browser / NodeJS) und den anderen verwendeten Modulen ( requirevs import) unterschiedlich sein. Um Ihnen ein Gefühl dafür zu geben, wie kompliziert dies ist, hat Node einige Dokumentationen über importvs requireund wie man sie zusammenarbeiten lässt.
Jeff Bowman
1
Wenn Sie module.exportsSyntax verwenden, befinden Sie sich wahrscheinlich nicht in einem ES6-Modul.
Bergi
Evert, dies ist Knoten js App, tsconfig wird bald
hinzugefügt
Ok, ich kann require nicht verwenden, da der Namespace 'abc' bei Verwendung der Konstruktion nicht gefunden werden kannexecute(a : abc.Class...
Zerumi

Antworten:

5

Wenn Sie “type”: “module”zu package.json hinzufügen, wird Node mitgeteilt , dass Sie ES2015-Module verwenden, wodurch der Fehler behoben werden soll. Anschließend müssen Sie Typescript anweisen , diesen Modultyp durch Festlegen “module”: “es2015”anstelle von “commonjs”tsconfig.json zu generieren.

Dies führt jedoch zu einem Problem mit dem aktuellen Code, da Sie zwar eine ES6- import {}Anweisung verwenden, diese jedoch mit der CommonJS- module.exports = {}Syntax exportieren und der ES- Modullader von Node ein Problem damit hat. Es gibt zwei Möglichkeiten, damit umzugehen:

  1. Behalten Sie das bei, module.exportsaber weisen Sie Node an, diese Datei als commonJS zu interpretieren, indem Sie ihr die Erweiterung .cjs geben .
  2. Ändern Sie die Exportanweisung in die ES2015-Syntax: export function execute(…)..

Die erste Option könnte etwas knifflig werden, da der Compiler .js-Dateien ausgibt und Sie sie (soweit ich weiß) ständig in .cjs ändern müssen. Mit der zweiten Option sollten Sie in der Lage sein, die Datei mit Node auszuführen (einschließlich des Flags --experimental-modules für Versionen <13.8).

Wenn Sie unbedingt commonJS verwenden müssen, ist es möglicherweise besser, die Typdefinitionen für Node: @ types / node zu installieren und den Import in das commonJS-Format zu ändern: require('abc')und die restlichen Einstellungen unverändert zu lassen (obwohl Sie "type" hinzufügen können). : "Commonjs" zu package.json, um explizit zu sein).

Zwiers
quelle
1
require ('abc'). Klasse kann nicht in .ts-Definitionen verwendet werden (wie eine: Klasse) ... Über die Erweiterung .cjs ... Typen können nur in .ts-Dateien sein ... ES2015 auch nicht meine Wahl, weil ich sie verwende Diese Module mit altem Import (erfordern) überall ... Ich habe dieses Problem mit JSDoc gelöst. Aber danke für die Antwort
Zerumi