Maszynopis: nie można użyć instrukcji importu poza modułem

19

Mam plik .ts w aplikacji node js (najnowsza wersja node.js dla 07.10.19) z importowanym modułem node bez domyślnego eksportu. Używam tej konstrukcji: import { Class } from 'abc';Kiedy uruchomić kod, mam ten błąd: Cannot use import statement outside a module.

W sieci widzę wiele rozwiązań tego problemu (dla .js), ale to mi nie pomaga, może dlatego, że mam plik maszynopisu. Oto mój kod:

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

Oto mój tsconfig.json:

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

    "strict": true
  }
}
Zerumi
źródło
Czy używasz tego w przeglądarce? Czy importinstrukcja jest pierwszym wierszem w twoim pliku?
Evert
1
Czy możesz opublikować plik tsconfig.json? Podczas kompilacji w Typescript możesz określić, który typ modułów produkuje, a prawidłowe typy mogą się różnić w zależności od używanego środowiska (przeglądarki / NodeJS) i innych używanych modułów ( requirevs import). Aby pokazać, jak to jest skomplikowane, Node ma dokumentację na temat importvs requirei jak je ze sobą współpracować.
Jeff Bowman,
1
Jeśli używasz module.exportsskładni, prawdopodobnie nie jesteś w module ES6.
Bergi
Evert, to jest aplikacja węzła js, wkrótce zostanie dodany
tsconfig
Ok, nie mogę użyć wymaga, ponieważ nie mogę znaleźć przestrzeni nazw „abc” podczas korzystania z konstrukcjiexecute(a : abc.Class...
Zerumi,

Odpowiedzi:

5

Dodanie “type”: “module”do package.json poinformuje Node, że używasz modułów ES2015, co powinno pozbyć się błędu, ale wtedy będziesz musiał powiedzieć Typescript, aby wygenerował ten typ modułu, ustawiając “module”: “es2015”zamiast “commonjs”w tsconfig.json.

Powoduje to jednak problem z bieżącym kodem, ponieważ chociaż używasz import {}instrukcji ES6 , eksportujesz przy użyciu module.exports = {}składni commonJS , a moduł ładujący modułu ES Node będzie miał z tym problem. Istnieją dwa sposoby radzenia sobie z tym:

  1. Zachowaj, module.exportsale powiedz Node, aby zinterpretował ten plik jako commonJS, nadając mu rozszerzenie .cjs .
  2. Zmień instrukcję eksportu na składnię ES2015: export function execute(…)..

Pierwsza opcja może być nieco trudna, ponieważ kompilator wyświetli pliki .js i będziesz musiał cały czas zmieniać ją na .cjs (o ile mi wiadomo). Z drugą opcją powinieneś być w stanie uruchomić plik z Węzłem (włączając flagę --experimental-modules dla wersji <13.8).

Jeśli absolutnie potrzebujesz użyć commonJS, być może lepiej jest zainstalować definicje typów dla Node: @ types / node i zmienić import na format commonJS: require('abc')i zachować pozostałe ustawienia bez zmian (chociaż możesz dodać „type” : „Commonjs” to package.json).

Zwiers
źródło
1
wymagają ('abc'). Klasa nie może być używana w definicjach .ts (jak: Class) ... Informacje o rozszerzeniu .cjs ... Typy mogą znajdować się tylko w plikach .ts ... ES2015 również nie jest moim wyborem, ponieważ używam wszędzie te moduły ze starym importem (wymagają) ... Rozwiązałem ten problem za pomocą JSDoc. Ale dziękuję za odpowiedź
Zerumi