Typescript: невозможно использовать оператор импорта вне модуля

19

У меня есть файл .ts в приложении node js (последняя версия node.js для 07.10.19) с импортом узла-модуля без экспорта по умолчанию. Я использую эту конструкцию: 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
  }
}
Zerumi
источник
Вы запускаете это в браузере? Является ли importвыписка первой строкой в ​​вашем файле?
Эверт
1
Можете ли вы опубликовать свой файл tsconfig.json? Когда вы компилируете в Typescript, вы можете определить, какой тип модулей он производит, и допустимые типы могут отличаться в зависимости от того, какую среду (browser / NodeJS) и какие другие модули ( requirevs import) вы используете. Просто чтобы дать вам представление о том, насколько это сложно, у Node есть некоторая документация о importпротивостоянии requireи о том, как заставить их работать вместе.
Джефф Боуман
1
Если вы используете module.exportsсинтаксис, вы, вероятно, не в модуле ES6.
Берги
Эверт, это приложение js для узла, скоро будет добавлен
tsconfig
Хорошо, я не могу использовать require, потому что не могу найти пространство имен '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 интерпретировать этот файл как commonJS, дав ему расширение .cjs .
  2. Измените оператор экспорта на синтаксис ES2015: export function execute(…)..

Первый вариант может быть немного сложным, потому что компилятор будет выводить файлы .js, и вам придется все время менять его на .cjs (насколько я знаю). Со вторым вариантом вы сможете запускать файл с Node (включая флаг --experimental-modules для версий <13.8).

Если вам абсолютно необходимо использовать commonJS, возможно, лучше установить определения типов для Node: @ types / node и изменить импорт на формат commonJS: require('abc')и оставить остальные настройки без изменений (хотя вы можете добавить «type»). : «Commonjs» в package.json должен быть явным).

Zwiers
источник
1
require ('abc'). Класс нельзя использовать в определениях .ts (например, a: Class) ... О расширении .cjs ... Типы могут быть только в файлах .ts ... ES2015 также не мой выбор, потому что я использую эти модули со старым импортом (требуют) везде ... Я решил эту проблему с помощью JSDoc. Но спасибо за ответ
Zerumi