Tengo un servidor express escrito en mecanografiado con "module": "es2020" en su tsconfig.
También desarrollé otro módulo es2020 para mi API de graphql, todavía en mecanografiado, y este módulo usa mongoose con importaciones con ese nombre:
import { Types } from 'mongoose' Todo funciona bien cuando compilo mi módulo graphql con tsc . Pero el servidor express que se ejecuta con
nodemon --watch './**/*.ts' --exec 'node --experimental-specifier-resolution=node --loader ts-node/esm' src/index.ts
no puede manejar la mangosta llamada import.
import { Types } from 'mongoose'; ^^^^^ SyntaxError: Named export 'Types' not found. The requested module 'mongoose' 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 'mongoose'; const { Types } = pkg; import mongoose from 'mongoose' Y reemplace Types por mongoose.Types .
Pero dado que tsc puede manejar la importación llamada mongoose, espero que también sea posible hacer que ts-node pueda hacerlo.
Cambie a commonjs , puedo mantener la sintaxis de importación/exportación en mi módulo graphql y compilarlo como un módulo cjs. Pero tendría que usar una sintaxis cjs en mi servidor express, y no quiero hacerlo.
Todo lo que tiene que hacer es quitar las llaves de los Tipos. Eso debería funcionar. Así como esto:
import Types from 'mongoose'Pero el nombre no importa.
import Types from 'mongoose' funciona porque estamos importando la exportación predeterminada del paquete (es por eso que el nombre que usamos no importa).
Sin embargo, cuando import * as Types from 'mongoose , le dice a JS que realmente quiere todo tal como está. Eso significa que en lugar de obtener la exportación predeterminada:
{ "function1": {}, "function2": {} }Obtienes esto:
{ "default": { "function1": {}, "function2": {} } } Entonces, también podría haber hecho Types.default pero probablemente no sea tan limpio. 🙂
Esta publicación de StackOverflow sugiere que podríamos hacer que ambos funcionen, pero también sugiere que sería una solución alternativa que probablemente no debería funcionar 😓