Introdução: «Seu velho amigo require de repente se tornou invisível»
\n\nVocê está escrevendo em TypeScript, tudo corre bem, e de repente — bum! O compilador exibe uma mensagem gelada: «TS2304: Cannot find name 'require'». Familiar? Se você está migrando de JavaScript para TypeScript ou trabalhando com projetos Node.js, certamente já se deparou com esse fantasma. Em 2025, esse erro ainda está no topo do Stack Overflow (mais de 200.000 visualizações), mas a boa notícia é que é fácil de resolver.
\n\nNeste artigo, vamos analisar por que o TypeScript não vê o require, quais configurações ajustar e — o mais importante — como escrever código moderno para esquecer esse problema para sempre. Vamos lá!
O que é TS2304 e por que ele aparece?
\n\nO erro TS2304: Cannot find name 'require' ocorre quando o TypeScript não consegue encontrar a definição da função global require. Em JavaScript (especialmente no ambiente Node.js), require é uma função nativa para importar módulos no estilo CommonJS. Mas o TypeScript, por padrão, não conhece o ambiente Node.js. Ele pensa que você está trabalhando no navegador, onde require não existe.
Cenário típico:
\n\n// app.ts\nconst express = require('express');\n// ❌ TS2304: Cannot find name 'require'\n\n\nEm 2025, o TypeScript (já na versão 5.x) usa por padrão módulos ES (import/export). Se você tenta usar require sem a configuração correta, o compilador protesta com razão.
Principais causas do erro:
\n- \n
- Pacote
@types/nodenão instalado — o TypeScript não conhece as APIs globais do Node.js. \n - Configuração incorreta do
tsconfig.json— faltatypes: ["node"]oumodulenão corresponde ao CommonJS. \n - Uso de sintaxe obsoleta — em 2025, é melhor usar
importem vez derequire. \n - Conflito entre CommonJS e ESModules — o projeto está configurado para módulos ES, mas você escreve código no estilo CommonJS. \n
Método nº1: Instalação do @types/node (solução rápida)
\n\nA maneira mais simples e comum é fazer o TypeScript «enxergar» o Node.js. Para isso, instale o pacote de tipos:
\n\nnpm install --save-dev @types/node\n\n\nDepois, adicione no tsconfig.json:
{\n "compilerOptions": {\n "types": ["node"]\n }\n}\n\n\nAgora o TypeScript conhece a função require, __dirname, process e outros objetos globais do Node.js. O erro desaparecerá.
Prós: rápido, funciona «de fábrica».
\nContras: você continua usando a sintaxe obsoleta do CommonJS.
Método nº2: Configuração de moduleResolution e esModuleInterop
\n\nSe você deseja usar require em um projeto configurado para módulos modernos, adicione as seguintes opções no tsconfig.json:
{\n "compilerOptions": {\n "module": "commonjs",\n "moduleResolution": "node",\n "esModuleInterop": true,\n "allowSyntheticDefaultImports": true\n }\n}\n\n\n- \n
"module": "commonjs"— especifica explicitamente que o código de saída será no formato CommonJS. \n "moduleResolution": "node"— procura módulos como o Node.js (primeiro emnode_modules). \n "esModuleInterop": true— permite importar módulos CommonJS viaimport(e vice-versa). \n "allowSyntheticDefaultImports": true— permite importação padrão de módulos sem exportação padrão. \n
Exemplo de código funcional:
\n\nimport express = require('express');\n// ou até mesmo\nconst express