módulos es6 - Typescript importar exportación predeterminada de ESM
Siento que esta es una pregunta que debería ser respondida pero no puedo encontrar una respuesta.
He cambiado mi proyecto TS a ESM. Así que mi package.json ahora tiene "type": "module" y mi tsconfig.json:
"target": "es2020",
"lib": ["es2020"],
"module": "node16",
"moduleResolution": "Node16",
"esModuleInterop": true, // Eases ESM support
"types": ["node"],
"allowSyntheticDefaultImports": true,
...
En su mayor parte las cosas funcionan muy bien, pero algunos módulos me dan problemas. Por ejemplo aedes y mqemitter y wait
import wait from 'wait'
await wait(1000)
El código de arriba "funciona" pero VSCode subraya en rojo el "wait" en la 2ª línea con el error:
This expression is not callable.
Type 'typeof import(".../node_modules/wait/wait")' has no call signatures.
He intentado, por supuesto:
import * as wait from 'wait'
y
import { default as wait } from 'wait'
Tengo lo que pensé que eran los ajustes ESM relevantes en mi configuración de TS.
Estoy en TS 4.8.3 y usando la última versión de todos estos paquetes problemáticos.
La mayoría de las publicaciones que veo parecen hablar solo sobre esModuleInterop, etc.
Agregar .default como wait.default() hace que el error desaparezca, pero el código no se ejecutará. Sin embargo, parecía funcionar aquí. uno
¿Alguna idea?
ACTUALIZACIÓN
Ok. El error me estaba desconcertando un poco; normalmente veo que VSCode me dice que instale @types/... o declare, que es lo que hice.
declare module wait
declare module aedes
declare module mqemitter
Sin embargo, no creo que esta sea la solución. Literalmente tengo que hacer esto para 15-20 módulos y algunos, como ajv, que están completamente hechos en TS, no deberían necesitar esto ya que tendría que modificar de alguna manera toda su definición de tipos; como nota al margen, ajv, porque lo llamo con un constructor como new Ajv(), produce un error ligeramente diferente esta expresión no es constructible. Hay problemas aparentemente relacionados, pero nada muy concreto hasta ahora.
Aquí hay un arenero.
Respuesta #1
Para los módulos problemáticos como wait y ajv en mi caso, los importé en un archivo de utilidades y luego los reexporté con un tipo de TS de la siguiente manera:
import wait from 'wait'
export const pause = wait as unknown as typeof wait.default
Respuesta #2
Estoy trabajando en este mismo problema ahora, y lo que me funcionó fue cambiar "moduleResolution" a "Node".
Esto, por supuesto, provocó algunos problemas más específicos de mi entorno y proceso de compilación, pero en mi caso fue el mejor camino a seguir.
