Búsqueda de sitios web

express - TypeScript: solo se puede importar por defecto usando la bandera 'esModuleInterop'


Tengo el siguiente index.ts:

import { User } from "./datatypes"
import express from 'express';

 console.log("hello world")

Este es mi package.json:

{
  "name": "simple_app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "tsc index.ts && node index.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "dotenv": "^16.0.0",
    "express": "^4.17.3"
  },
  "devDependencies": {
    "@types/express": "^4.17.13",
    "@types/node": "^17.0.23",
    "ts-node": "^10.7.0",
    "typescript": "^4.6.3"
  }
}

Y este es mi tsconfig.json:

{
    "compilerOptions": {
      "module": "commonjs",
      "esModuleInterop": true,
      "resolveJsonModule": true,
      "target": "es6",
      "moduleResolution": "node",
      "sourceMap": true,
      "outDir": "dist"
    },
    "lib": ["es2015"]
  }

Cuando escribo npm run start, obtengo:

 Module '"/mnt/c/Users/raffa/Desktop/simple_app/node_modules/@types/express/index"' can only be default-imported using the 'esModuleInterop' flag

2 import express from 'express';
         ~~~~~~~

  node_modules/@types/express/index.d.ts:133:1
    133 export = e;
        ~~~~~~~~~~~
    This module is declared with using 'export =', and can only be used with a default import when using the 'esModuleInterop' flag.

¿Cómo puedo resolver este problema?

Respuesta #1

Si llamas a tsc desde la línea de comandos con una ruta de archivo específica, ignorará tu tsconfig.json

Documentos de Typescript (https://www.typescriptlang.org/docs/handbook/tsconfig-json.html):

Cuando se especifican archivos de entrada en la línea de comandos, se ignoran los archivos tsconfig.json.

Esto significa que la parte esModuleInterop de tsconfig.json no tendrá efecto si ejecutas tsc index.ts.

Es posible solucionarlo usando import * as express from 'express';, pero pueden surgir otros problemas debido a las configuraciones de TS ignoradas.

Un problema con tsc -w && node index.js (de uno de los comentarios) es que el -w hará que espere en lugar de terminar por sí solo, lo que significa que no llegarás a la parte después del "&&".
Por lo tanto, no llegarás a la parte de node index.js.
(Pero al menos esta vez, tsc no obtiene un archivo específico, por lo tanto la configuración no se ignora)

Además, en tu configuración, el outDir está establecido en dist, por lo que el archivo compilado irá allí. Por lo tanto, deberías usar lo siguiente en su lugar:
tsc && node ./dist/index.js

Artículos relacionados