Введение: «Ваш старый друг require вдруг стал невидимкой»
Вы пишете на TypeScript, всё идёт гладко, и тут — бац! Компилятор выдаёт ледяное сообщение: «TS2304: Cannot find name 'require'». Знакомо? Если вы переходите с JavaScript на TypeScript или работаете с Node.js-проектами, вы наверняка сталкивались с этим призраком. В 2025 году эта ошибка по-прежнему в топе Stack Overflow (более 200 000 просмотров), но хорошая новость: её легко победить.
В этой статье мы разберём, почему TypeScript не видит require, какие конфиги нужно подкрутить и — самое главное — как писать современный код, чтобы забыть об этой проблеме навсегда. Поехали!
Что такое TS2304 и почему он появляется?
Ошибка TS2304: Cannot find name 'require' возникает, когда TypeScript не может найти определение глобальной функции require. В JavaScript (особенно в среде Node.js) require — это нативная функция для импорта модулей в стиле CommonJS. Но TypeScript по умолчанию не знает о Node.js-окружении. Он думает, что вы работаете в браузере, где require не существует.
Типичный сценарий:
// app.ts
const express = require('express');
// ❌ TS2304: Cannot find name 'require'
В 2025 году TypeScript (уже версии 5.x) по умолчанию использует ES-модули (import/export). Если вы пытаетесь использовать require без правильной настройки, компилятор справедливо протестует.
Основные причины ошибки:
- Не установлен пакет
@types/node— TypeScript не знает о глобальных API Node.js. - Неправильная настройка
tsconfig.json— отсутствуетtypes: ["node"]илиmoduleне соответствует CommonJS. - Использование устаревшего синтаксиса — в 2025 году лучше использовать
importвместоrequire. - Конфликт между CommonJS и ESModules — проект настроен на ES-модули, но вы пишете код в стиле CommonJS.
Способ №1: Установка @types/node (быстрое решение)
Самый простой и распространённый способ — дать TypeScript «увидеть» Node.js. Для этого установите пакет типов:
npm install --save-dev @types/node
После этого добавьте в tsconfig.json:
{
"compilerOptions": {
"types": ["node"]
}
}
Теперь TypeScript знает о функции require, __dirname, process и других глобальных объектах Node.js. Ошибка исчезнет.
Плюсы: быстро, работает «из коробки».
Минусы: вы продолжаете использовать устаревший синтаксис CommonJS.
Способ №2: Настройка moduleResolution и esModuleInterop
Если вы хотите использовать require в проекте, который настроен на современные модули, добавьте в tsconfig.json следующие опции:
{
"compilerOptions": {
"module": "commonjs",
"moduleResolution": "node",
"esModuleInterop": true,
"allowSyntheticDefaultImports": true
}
}
"module": "commonjs"— явно указываем, что выходной код будет в формате CommonJS."moduleResolution": "node"— ищем модули как Node.js (сначалаnode_modules)."esModuleInterop": true— позволяет импортировать CommonJS-модули черезimport(и наоборот)."allowSyntheticDefaultImports": true— разрешает дефолтный импорт из модулей без дефолтного экспорта.
Пример рабочего кода:
import express = require('express');
// или даже
const express = require('express'); // теперь работает
Этот способ — золотая середина для миграции с JS на TS.
Способ №3: Современный подход — используйте import вместо require (рекомендуется для 2025)
Лучший способ избежать ошибки TS2304 — вообще не использовать require. В 2025 году TypeScript и Node.js (начиная с версии 16+) отлично поддерживают ES-модули. Переходите на современный синтаксис:
// ❌ Старый стиль
const express = require('express');
// ✅ Новый стиль (2025)
import express from 'express';
Для этого настройте tsconfig.json соответствующим образом:
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "bundler", // или "node16"
"esModuleInterop": true,
"strict": true
}
}
В package.json добавьте:
{
"type": "module"
}
Теперь ваш проект полностью современен. Вы получаете:
- Статический анализ импортов (лучше автодополнение в IDE).
- Дребезг (tree-shaking) для уменьшения размера бандла.
- Будущую совместимость с новыми возможностями JS.
Сравнительная таблица: какой способ выбрать?
| Способ | Сложность | Когда использовать | Рекомендация 2025 |
|---|---|---|---|
| @types/node + require | Низкая | Быстрое исправление легаси-проекта | Только для срочных правок |
| Настройка tsconfig (CommonJS) | Средняя | Миграция с JS на TS | Временное решение |
| Полный переход на import (ESModules) | Высокая (требует рефакторинга) | Новые проекты, современная разработка | ✅ Лучший выбор |
Частые ошибки и их решения
1. «Я установил @types/node, но ошибка осталась»
Проверьте, что в