Introducción: «Tu viejo amigo require de repente se volvió invisible»
\n\nEstás escribiendo en TypeScript, todo va bien, y de repente — ¡pum! El compilador muestra un mensaje gélido: «TS2304: Cannot find name 'require'». ¿Te suena? Si estás migrando de JavaScript a TypeScript o trabajas con proyectos Node.js, seguramente te has topado con este fantasma. En 2025, este error sigue estando en el top de Stack Overflow (más de 200,000 visitas), pero la buena noticia es que es fácil de vencer.
\n\nEn este artículo, analizaremos por qué TypeScript no ve require, qué configuraciones hay que ajustar y — lo más importante — cómo escribir código moderno para olvidar este problema para siempre. ¡Allá vamos!
¿Qué es TS2304 y por qué aparece?
\n\nEl error TS2304: Cannot find name 'require' ocurre cuando TypeScript no puede encontrar la definición de la función global require. En JavaScript (especialmente en el entorno Node.js), require es una función nativa para importar módulos al estilo CommonJS. Pero TypeScript, por defecto, no conoce el entorno Node.js. Piensa que estás trabajando en un navegador, donde require no existe.
Escenario típico:
\n\n// app.ts\nconst express = require('express');\n// ❌ TS2304: Cannot find name 'require'\n\n\nEn 2025, TypeScript (ya en la versión 5.x) utiliza por defecto módulos ES (import/export). Si intentas usar require sin la configuración adecuada, el compilador protesta con razón.
Principales causas del error:
\n- \n
- No está instalado el paquete
@types/node— TypeScript desconoce las APIs globales de Node.js. \n - Configuración incorrecta de
tsconfig.json— faltatypes: ["node"]omoduleno corresponde a CommonJS. \n - Uso de sintaxis obsoleta — en 2025 es mejor usar
importen lugar derequire. \n - Conflicto entre CommonJS y ESModules — el proyecto está configurado para módulos ES, pero escribes código al estilo CommonJS. \n
Método n.º 1: Instalación de @types/node (solución rápida)
\n\nLa forma más sencilla y común es hacer que TypeScript «vea» Node.js. Para ello, instala el paquete de tipos:
\n\nnpm install --save-dev @types/node\n\n\nDespués, agrega esto en tsconfig.json:
{\n "compilerOptions": {\n "types": ["node"]\n }\n}\n\n\nAhora TypeScript conoce la función require, __dirname, process y otros objetos globales de Node.js. El error desaparecerá.
Ventajas: rápido, funciona «de fábrica».
\nDesventajas: sigues usando la sintaxis obsoleta de CommonJS.
Método n.º 2: Configuración de moduleResolution y esModuleInterop
\n\nSi quieres usar require en un proyecto configurado con módulos modernos, agrega las siguientes opciones en tsconfig.json:
{\n "compilerOptions": {\n "module": "commonjs",\n "moduleResolution": "node",\n "esModuleInterop": true,\n "allowSyntheticDefaultImports": true\n }\n}\n\n\n- \n
"module": "commonjs"— indicamos explícitamente que el código de salida será en formato CommonJS. \n "moduleResolution": "node"— buscamos módulos como Node.js (primero ennode_modules). \n "esModuleInterop": true— permite importar módulos CommonJS medianteimport(y viceversa). \n "allowSyntheticDefaultImports": true— permite la importación por defecto desde módulos que no tienen exportación por defecto. \n
Ejemplo de código funcional:
\n\nimport express = require('express');\n// o incluso\nconst express