Неможливо використовувати оператор імпорту за межами модуля


19

У мене є .ts файл у node js (остання версія node.js за 07.10.19) із імпортом node-модуля без експорту за замовчуванням. Я використовую цю конструкцію: import { Class } from 'abc';Коли я запускаю код, у мене є ця помилка: Cannot use import statement outside a module.

У мережі я бачу багато рішень цієї проблеми (для .js), але це мені не допомагає, можливо, тому що у мене є файл машинопису. Ось мій код:

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

Ось мій tsconfig.json:

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

    "strict": true
  }
}

Ви запускаєте це в браузері? Чи importтвердження є першим рядком у вашому файлі?
Еверт

1
Чи можете ви опублікувати файл tsconfig.json? Під час компіляції в Typescript можна визначити, який тип модулів він виробляє, а дійсні типи можуть відрізнятися залежно від того, яке середовище (браузер / NodeJS) та які інші модулі ( requirevs import) ви використовуєте. Тільки для того, щоб зрозуміти, наскільки це складно, Node має деяку документацію про importvs requireі як змусити їх працювати разом.
Джефф Бауман

1
Якщо ви використовуєте module.exportsсинтаксис, ви, ймовірно, не в модулі ES6.
Берги

Evert, це додаток js js, tsconfig буде додано незабаром
Zerumi

Гаразд, я не можу використовувати вимагаю, оскільки не можу знайти простір імен 'abc' під час використання конструкціїexecute(a : abc.Class...
Zerumi

Відповіді:


5

Додавання “type”: “module”в package.json скаже Node, що ви використовуєте модулі ES2015, які повинні позбутися помилки, але тоді вам потрібно буде повідомити Typescript для створення цього типу модуля, встановивши “module”: “es2015”замість “commonjs”tsconfig.json.

Однак це викликає проблему з поточним кодом, оскільки, хоча ви використовуєте оператор ES6, import {}ви експортуєте за допомогою module.exports = {}синтаксису commonJS , і завантажувач модулів ES Node матиме проблему з ним. Є два способи впоратися з цим:

  1. Тримайте, module.exportsале скажіть, Node інтерпретувати цей файл як звичайний JS, надавши йому .cjs розширення .
  2. Змініть оператор експорту в синтаксис ES2015: export function execute(…)..

Перший варіант може бути трохи хитрим, оскільки компілятор видасть .js файли, і вам доведеться постійно змінювати його на .cjs (наскільки я знаю). З другою опцією ви зможете запустити файл з Node (включаючи прапор --experimental-module для версій <13.8).

Якщо вам абсолютно потрібно використовувати commonJS, можливо, краще встановити визначення типів для Node: @ types / node та змінити імпорт у формат commonJS: require('abc')а інші параметри зберегти такими, якими вони є (хоча ви можете додати "type" : "Commonjs" для package.json має бути явним).


1
вимагати ('abc'). Клас не можна використовувати у визначеннях .ts (наприклад, клас) ... Про розширення .cjs ... Типи можуть бути лише у файлах .ts ... ES2015 також не мій вибір, тому що я використовую ці модулі зі старим імпортом (вимагають) скрізь ... Я вирішив цю проблему за допомогою JSDoc. Але дякую за відповідь
Zerumi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.