Node.js ESM parece funcionar de manera diferente a TypeScript.
Está dando como resultado programas que pasan la verificación de tipo y, sin embargo, fallan en tiempo de ejecución.
paquete.json
{ "dependencies": { "@types/lodash": "^4.0.0", "lodash": "^4.0.0", "typescript": "^4.0.0" }, "type": "module" }tsconfig.json
{ "compilerOptions": { "module": "es2015" } }a.ts
import { partition } from "lodash"; partition([1, 2, 3, 4], n => n % 2);Correr
npm install node_modules/.bin/tsc -p . node index.jsY el programa falla:
file:///home/paul/test44/index.js:1 import { partition } from "lodash"; ^^^^^^^^^ SyntaxError: Named export 'partition' not found. The requested module 'lodash' is a CommonJS module, which may not support all module.exports as named exports. CommonJS modules can always be imported via the default export, for example using: import pkg from 'lodash'; const { partition } = pkg; at ModuleJob._instantiate (node:internal/modules/esm/module_job:124:21) at async ModuleJob.run (node:internal/modules/esm/module_job:179:5) at async Loader.import (node:internal/modules/esm/loader:178:24) at async Object.loadESM (node:internal/process/esm_loader:68:5) at async handleMainPromise (node:internal/modules/run_main:63:12)¿Cómo puedo alinear TypeScript y Node.js ESM para que la verificación de tipos coincida con el comportamiento del tiempo de ejecución?
EDITAR:
He intentado usar typescript@next con "module": "nodenext" .
Ocurre el mismo error.
El problema es que estás mezclando módulos ES y ComonJS; está en el texto del mensaje de error. Este es todavía un concepto relativamente nuevo y es fácil pasarlo por alto cuando esperarías que los módulos... deberían... simplemente funcionar.
TypeScript solo proporciona declaraciones de import , que luego transpilarán al sistema de módulos elegido; en el caso de ESM, no hay mucho que transpilar ya que son sintácticamente similares.
Dado que está transpilando a ESM, el problema no es TypeScript; es el motor subyacente de Node.js y cómo trata los sistemas de módulos mixtos. Ha escrito algo en ESM (concedido, usando TypeScript) y está tratando de importar algo más escrito en CommonJS.
Para ejecutar su código en función de un módulo CommonJS, debe:
module.createRequire() para importar el módulo CommonJS en una forma utilizableFuentes:
https://nodejs.org/api/esm.html#no-require-exports-or-moduleexports https://nodejs.org/api/module.html#modulecreaterequirefilename