Estoy usando Node v18.0.0 con TypeScript y parece que la clase TextEncoder es global .
Desafortunadamente, este código const textEncoder = new TextEncoder(); no es válido porque no sabe acerca de la clase. Tendré que importar el paquete util para que funcione, de lo contrario aparece el error
No se puede encontrar el nombre 'TextEncoder'. ¿Quiso decir 'textEncoder'?ts(2552)
Estoy usando los paquetes "@types/node": "17.0.23" y "typescript": "4.6.3" . El archivo tsconfig.json
{ "compilerOptions": { "baseUrl": ".", "declaration": true, "esModuleInterop": true, "lib": [ "esnext" ], "module": "commonjs", "outDir": "build", "resolveJsonModule": true, "strict": true, "target": "es2019" }, "include": [ "./**/*.ts" ], "exclude": [ "./build" ] }¿Alguien sabe cómo arreglar esto? ¿Tengo que usar algunos paquetes adicionales o modificar mi configuración de TS?
Por favor, hágamelo saber si necesita más información!
Esto parece una inconsistencia (al menos) entre la documentación de Node.js (y el tiempo de ejecución) y el paquete @types/node en DefinitelyTyped. Este problema es muy similar aeste con URL , que desde entonces se solucionó agregando una declaración global en url.d.ts . Puede valer la pena abrir un problema (y hacer una PR).
Como dices, TextEncoder definitivamente es global (tanto la documentación como una prueba rápida nos lo dicen), pero @types/node/globals.d.ts no lo tiene. @types/node/utils.d.ts lo tiene (como indicó), e incluso tiene el comentario "La clase TextEncoder también está disponible en el objeto global". pero... no lo es (a diferencia de URL , que [ahora] lo es).
Si el código que está escribiendo es específico de Node.js, solo haría la importación y no me preocuparía.
Pero si se supone que el código que está escribiendo se dirige tanto a Node.js como a los navegadores, obviamente esa no es una opción. Una solución alternativa mencionada en el hilo del problema de URL es agregar "dom" a su configuración de configuración de lib , pero eso significa que todo el DOM se agrega a su espacio de nombres global.
Alternativamente, hasta que/a menos que se actualicen los tipos, puede declarar el global usted mismo. En la raíz de tu proyecto:
whatever.d.ts :
import { TextEncoder as _TextEncoder } from "node:util"; declare global { var TextEncoder: typeof _TextEncoder; } No obtiene información emergente útil cuando hace new TextEncoder( , pero funciona, y obtiene información útil para sus métodos, etc.