Introduction : « Votre vieil ami require est soudainement devenu invisible »
\n\nVous écrivez en TypeScript, tout se passe bien, et soudain — bam ! Le compilateur affiche un message glacial : « TS2304 : Cannot find name 'require' ». Cela vous dit quelque chose ? Si vous passez de JavaScript à TypeScript ou travaillez sur des projets Node.js, vous avez probablement déjà rencontré ce fantôme. En 2025, cette erreur est toujours en tête sur Stack Overflow (plus de 200 000 vues), mais la bonne nouvelle est qu'elle est facile à vaincre.
\n\nDans cet article, nous allons voir pourquoi TypeScript ne voit pas require, quels fichiers de configuration il faut ajuster et — surtout — comment écrire du code moderne pour oublier ce problème pour toujours. C'est parti !
Qu'est-ce que TS2304 et pourquoi apparaît-il ?
\n\nL'erreur TS2304 : Cannot find name 'require' se produit lorsque TypeScript ne trouve pas la définition de la fonction globale require. En JavaScript (notamment dans l'environnement Node.js), require est une fonction native pour importer des modules au style CommonJS. Mais TypeScript, par défaut, ne connaît pas l'environnement Node.js. Il pense que vous travaillez dans un navigateur, où require n'existe pas.
Scénario typique :
\n\n// app.ts\nconst express = require('express');\n// ❌ TS2304 : Cannot find name 'require'\n\n\nEn 2025, TypeScript (déjà version 5.x) utilise par défaut les modules ES (import/export). Si vous essayez d'utiliser require sans une configuration correcte, le compilateur proteste à juste titre.
Causes principales de l'erreur :
\n- \n
- Le paquet
@types/noden'est pas installé — TypeScript ne connaît pas les API globales de Node.js. \n - Configuration incorrecte de
tsconfig.json— absence detypes: ["node"]oumodulene correspond pas à CommonJS. \n - Utilisation d'une syntaxe obsolète — en 2025, il est préférable d'utiliser
importau lieu derequire. \n - Conflit entre CommonJS et ESModules — le projet est configuré pour les modules ES, mais vous écrivez du code en style CommonJS. \n
Méthode n°1 : Installation de @types/node (solution rapide)
\n\nLa méthode la plus simple et la plus courante est de permettre à TypeScript de « voir » Node.js. Pour cela, installez le paquet de types :
\n\nnpm install --save-dev @types/node\n\n\nEnsuite, ajoutez dans tsconfig.json :
{\n "compilerOptions": {\n "types": ["node"]\n }\n}\n\n\nMaintenant, TypeScript connaît la fonction require, __dirname, process et d'autres objets globaux de Node.js. L'erreur disparaîtra.
Avantages : rapide, fonctionne « prêt à l'emploi ».
\nInconvénients : vous continuez à utiliser la syntaxe obsolète de CommonJS.
Méthode n°2 : Configuration de moduleResolution et esModuleInterop
\n\nSi vous souhaitez utiliser require dans un projet configuré pour les modules modernes, ajoutez les options suivantes dans tsconfig.json :
{\n "compilerOptions": {\n "module": "commonjs",\n "moduleResolution": "node",\n "esModuleInterop": true,\n "allowSyntheticDefaultImports": true\n }\n}\n\n\n- \n
"module": "commonjs"— indique explicitement que le code de sortie sera au format CommonJS. \n "moduleResolution": "node"— recherche les modules comme Node.js (d'abordnode_modules). \n "esModuleInterop": true— permet d'importer des modules CommonJS viaimport(et vice versa). \n "allowSyntheticDefaultImports": true— autorise l'import par défaut depuis des modules sans export par défaut. \n
Exemple de code fonctionnel :
\n\nimport express = require('express');\n// ou même\nconst express