Typographie: impossible d'utiliser l'instruction d'importation en dehors d'un module

19

J'ai un fichier .ts dans l'application node js (dernière version de node.js pour le 07.10.19) avec l'importation du module node sans l'exportation par défaut. J'utiliser cette construction: import { Class } from 'abc';Quand je lance le code, j'ai cette erreur: Cannot use import statement outside a module.

Dans le réseau, je vois de nombreuses solutions à ce problème (pour .js), mais cela ne m'aide pas, peut-être parce que j'ai un fichier dactylographié. Voici mon code:

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

Voici mon tsconfig.json:

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

    "strict": true
  }
}
Zerumi
la source
Exécutez-vous cela dans un navigateur? L' importénoncé est-il la première ligne de votre dossier?
Evert
1
Pouvez-vous publier votre fichier tsconfig.json? Lorsque vous compilez dans Typescript, vous pouvez déterminer quel type de modules il produit et les types valides peuvent différer selon l'environnement (navigateur / NodeJS) et les autres modules ( requirevs import) que vous utilisez. Juste pour vous donner une idée de la complexité de cela, Node a de la documentation sur importvs requireet comment les faire fonctionner ensemble.
Jeff Bowman
1
Si vous utilisez la module.exportssyntaxe, vous n'êtes probablement pas dans un module ES6.
Bergi
Evert, c'est l'application node js, tsconfig sera bientôt ajouté
Zerumi
Ok, je ne peux pas utiliser require car impossible de trouver l'espace de nom 'abc' lors de l'utilisation de la constructionexecute(a : abc.Class...
Zerumi

Réponses:

5

L'ajout “type”: “module”à package.json indiquera à Node que vous utilisez des modules ES2015, ce qui devrait supprimer l'erreur, mais vous devrez ensuite dire à Typescript de générer ce type de module en définissant “module”: “es2015”plutôt que “commonjs”dans tsconfig.json.

Cela provoque cependant un problème avec le code actuel car, bien que vous utilisiez une import {}instruction ES6 , vous exportez à l'aide de la module.exports = {}syntaxe commonJS , et le chargeur de module ES de Node aura un problème avec celle-ci. Il y a deux façons de le gérer:

  1. Conservez le module.exportsmais dites à Node d'interpréter ce fichier comme commonJS en lui donnant l'extension .cjs .
  2. Modifiez l'instruction d'exportation en syntaxe ES2015: export function execute(…)..

La première option pourrait devenir un peu délicate car le compilateur produira des fichiers .js et vous devrez le changer en .cjs tout le temps (pour autant que je sache). Avec la deuxième option, vous devriez pouvoir exécuter le fichier avec Node (y compris l'indicateur --experimental-modules pour les versions <13.8).

Si vous devez absolument utiliser commonJS, il est peut-être préférable d'installer les définitions de type pour Node: @ types / node et de modifier l'importation au format commonJS: require('abc')et de conserver les autres paramètres tels qu'ils sont (bien que vous puissiez ajouter «type» : «Commonjs» à package.json pour être explicite).

Zwiers
la source
1
require ('abc'). La classe ne peut pas être utilisée dans les définitions .ts (comme a: Class) ... À propos de l'extension .cjs ... Les types ne peuvent être que dans des fichiers .ts ... ES2015 n'est pas non plus mon choix car j'utilise ces modules avec une ancienne importation (obligatoire) partout ... J'ai résolu ce problème en utilisant JSDoc. Mais merci pour la réponse
Zerumi