Texto mecanografiado: No se puede usar la declaración de importación fuera de un módulo

19

Tengo un archivo .ts en la aplicación node js (última versión de node.js para el 10/07/19) con la importación del módulo de nodo sin exportación predeterminada. Puedo usar esta construcción: import { Class } from 'abc';Cuando corro el código, tengo este error: Cannot use import statement outside a module.

En la red veo muchas soluciones para este problema (para .js), pero no me ayuda, tal vez porque tengo un archivo de mecanografía. Aquí está mi código:

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

Aquí está mi tsconfig.json:

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

    "strict": true
  }
}
Zerumi
fuente
¿Estás ejecutando esto en un navegador? ¿Es la importdeclaración la primera línea en su archivo?
Evert
1
¿Puedes publicar tu archivo tsconfig.json? Cuando compila en Typecript, puede determinar qué tipo de módulos produce, y los tipos válidos pueden diferir según el entorno (navegador / NodeJS) y qué otros módulos ( requirevs import) utiliza. Solo para darle una idea de lo complicado que es esto, Node tiene cierta documentación sobre importvs requirey cómo hacer que funcionen juntos.
Jeff Bowman
1
Si está utilizando la module.exportssintaxis, probablemente no esté en un módulo ES6.
Bergi
Sin embargo, esta es la aplicación de nodo js, ​​tsconfig se agregará pronto
Zerumi
Ok, no puedo usar require porque no puedo encontrar el espacio de nombres 'abc' cuando uso construcciónexecute(a : abc.Class...
Zerumi

Respuestas:

5

Agregar “type”: “module”a package.json le indicará a Node que está utilizando módulos ES2015, lo que debería eliminar el error, pero luego deberá indicar a Typecript que genere este tipo de módulo configurando en “module”: “es2015”lugar de “commonjs”tsconfig.json.

Sin embargo, esto causa un problema con el código actual porque, aunque está utilizando una import {}instrucción ES6 , está exportando utilizando la module.exports = {}sintaxis commonJS , y el cargador del módulo ES de Node tendrá un problema. Hay dos formas de lidiar con esto:

  1. Mantenga el module.exportsNodo pero dígale a Node que interprete este archivo como commonJS dándole una extensión .cjs .
  2. Cambie la declaración de exportación a la sintaxis ES2015: export function execute(…)..

La primera opción podría ser un poco complicada porque el compilador generará archivos .js y tendrías que cambiarlo a .cjs todo el tiempo (que yo sepa). Con la segunda opción, debería poder ejecutar el archivo con Node (incluido el indicador --experimental-modules para las versiones <13.8).

Si absolutamente necesita usar commonJS, quizás sea mejor instalar las definiciones de tipo para Node: @ types / node y cambiar la importación al formato commonJS: require('abc')y mantener el resto de la configuración como está (aunque puede agregar "type" : "Commonjs" a package.json para ser explícito).

Zwiers
fuente
1
require ('abc'). La clase no puede usarse en definiciones .ts (como a: Class) ... Acerca de la extensión .cjs ... Los tipos solo pueden estar en archivos .ts ... ES2015 tampoco es mi elección porque uso estos módulos con importación antigua (requieren) en todas partes ... Resolví este problema usando JSDoc. Pero gracias por la respuesta
Zerumi