TypeScript error TS2304: cannot find name 'require' — как исправить в 2025

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: «Ваш старый друг 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, но ошибка осталась»

Проверьте, что в

Блоги

Рекомендаций по книгам