60 votes

Une importation de style espace de noms ne peut pas être appelée ou construite et entraînera un échec à l'exécution

Des choses étranges se produisent ici, avec TypeScript 2.7.2, dans la version 1.21 de VSCode avec @ types / express et le code qui suit, dans certains cas, VSCode génère des erreurs indiquant qu '"Une importation de style espace de noms ne peut pas être appelée ou construite, et provoquera un échec à l'exécution. ". Cependant, sur d'autres machines avec des configurations similaires et des fichiers tsconfig.json similaires, le code fonctionne juste. Ce qui se passe ici:

 import { Bank } from './Bank';
import * as Express from 'express';  <== errors here..

let app: Express.Express;
this.app = Express();                <== and here
 

Pourquoi cela arrive-t-il?

TIA,

John.

136voto

fathy Points 2105

L'erreur se produit-il avec esModuleInterop: true. Peut-être VSCode est ignorant votre tsconfig.json ou d'une autre avec l' esModuleInterop: true est utilisé.

Pour un correctif définitif définir l'option de compilateur esModuleInterop de true et l'utilisation import express au lieu de import * as express.

Le problème :

L'ES6 spécification définit la notion d ' "espace de noms de l'objet". Un espace de noms de l'objet est - namespaceObject dans cette déclaration : import * as namespaceObject from 'a-module'. L' typeof cet objet est - object, vous n'êtes pas censé être capable de l'appeler.

Que vous utilisiez import * as express jusqu'à présent en raison express est un CommonJS module, pour Node.js il est exporté à l'aide de module.exports. Toutefois, il est illégal dans l'ES6 spec, et la Machine maintenant, vous avertit.

La solution :

Paramètre esModuleInterop true fera Tapuscrit envelopper votre import des appels pour vérifier si le module est un ES6 module ou un CommonJS. Si c'est un CommonJS module et que vous utilisez import default from 'module' Tapuscrit de trouver et retourner le bon CommonJS module.

À partir du Tapuscrit note de version :

Remarque: Le nouveau comportement est ajouté sous un drapeau pour éviter injustifiée les pauses à l'existant, des bases de code. Nous recommandons fortement l'appliquant à la fois à les projets nouveaux et existants. Pour les projets existants, importations d'espace de noms (import * que s'exprimer à partir de "l'express"; express();) devront être converti par défaut à l'importation (import express à partir de "l'express"; express();).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X