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
  }
}

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).


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.