Texto datilografado: Não é possível usar a instrução de importação fora de um módulo

19

Eu tenho um arquivo .ts no nó js (versão mais recente do node.js para 07.10.19) com a importação de node-module sem exportação padrão. Eu uso essa construção: import { Class } from 'abc';Quando eu executar o código, eu tenho esse erro: Cannot use import statement outside a module.

Na rede, vejo muitas soluções para esse problema (para .js), mas isso não ajuda em mim, talvez porque eu tenha um arquivo datilografado. Aqui está o meu código:

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

Aqui está o meu tsconfig.json:

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

    "strict": true
  }
}
Zerumi
fonte
Você está executando isso em um navegador? A importdeclaração é a primeira linha do seu arquivo?
Evert
11
Você pode postar seu arquivo tsconfig.json? Ao compilar no Typescript, é possível determinar qual tipo de módulo ele produz e os tipos válidos podem diferir dependendo do ambiente (navegador / NodeJS) e de quais outros módulos ( requirevs import) você usa. Apenas para lhe dar uma idéia de como isso é complicado, o Node tem alguma documentação sobre importvs requiree como fazê-los trabalhar juntos.
Jeff Bowman
11
Se você estiver usando module.exportssintaxe, provavelmente não está em um módulo ES6.
Bergi 7/10/19
Evert, este é app nó js, TSconfig será adicionar em breve
Zerumi
Ok, eu não posso usar exigem porque não consegue encontrar namespace 'abc' ao usar construçãoexecute(a : abc.Class...
Zerumi

Respostas:

5

Adicionar “type”: “module”ao package.json informará ao Node que você está usando os módulos do ES2015, o que deve eliminar o erro, mas você precisará informar o Typescript para gerar esse tipo de módulo configurando em “module”: “es2015”vez de “commonjs”em tsconfig.json.

No entanto, isso causa um problema com o código atual porque, embora você esteja usando uma import {}instrução ES6 , você está exportando usando a module.exports = {}sintaxe commonJS , e o carregador de módulo ES do Node terá um problema. Existem duas maneiras de lidar com isso:

  1. Mantenha o module.exportsbut, mas diga ao Node para interpretar esse arquivo como commonJS, fornecendo uma extensão .cjs .
  2. Altere a instrução de exportação para a sintaxe do ES2015: export function execute(…)..

A primeira opção pode ficar um pouco complicada porque o compilador produzirá arquivos .js e você precisará alterá-lo para .cjs o tempo todo (tanto quanto eu sei). Com a segunda opção, você poderá executar o arquivo com Nó (incluindo o sinalizador --experimental-modules para versões <13.8).

Se você absolutamente precisar usar o commonJS, talvez seja melhor instalar as definições de tipo para Node: @ types / node e alterar a importação para o formato commonJS: require('abc')e mantenha o restante das configurações como estão (embora você possa adicionar "type" : “Commonjs” para package.json para ser explícito).

Zwiers
fonte
11
require ('abc'). A classe não pode ser usada nas definições .ts (como a: Class) ... Sobre a extensão .cjs ... Os tipos só podem estar em arquivos .ts ... ES2015 também não é minha escolha, porque eu uso este módulos com importação antiga (requer) em todos os lugares ... Eu resolvi esse problema usando JSDoc. Mas obrigado pela resposta
Zerumi 23/02