Короткий ответ: сначала не угадывайте, а определите, где именно ошибка. В проектах Node.js и TypeScript проблемы обычно делятся на четыре группы: TypeScript не компилирует код, Node.js не запускает скомпилированный файл, конфликтуют ESM и CommonJS, либо не установлены типы для Node.js и библиотек
Самый полезный порядок диагностики такой:
npx tsc --noEmit
node dist/index.js
cat package.json
cat tsconfig.json
Если tsc --noEmit падает, чините типы и tsconfig. Если TypeScript проходит, но node dist/index.js падает, проблема уже в runtime, путях, формате модулей или сборке
Ошибка Cannot find module
Частый пример:
Error: Cannot find module './service'
Проверьте три вещи. Первая — файл действительно существует. Вторая — после компиляции он попадает в dist. Третья — путь в импорте совпадает с реальной структурой
Пример структуры:
src/
index.ts
service.ts
dist/
index.js
service.js
Импорт:
import { getUser } from "./service";
Если вы запускаете src/index.ts напрямую через node, Node.js не обязан понимать TypeScript-файлы так же, как ваш сборщик. Для обычного проекта надежнее компилировать:
npx tsc
node dist/index.js
Ошибка про require и import
Если видите:
ReferenceError: require is not defined in ES module scope
или:
SyntaxError: Cannot use import statement outside a module
значит, смешались ESM и CommonJS. Выберите один режим и настройте его последовательно
Вариант CommonJS:
{
"compilerOptions": {
"module": "CommonJS",
"target": "ES2022",
"outDir": "dist",
"rootDir": "src"
}
}
Вариант ESM:
{
"type": "module",
"scripts": {
"build": "tsc",
"start": "node dist/index.js"
}
}
{
"compilerOptions": {
"module": "NodeNext",
"moduleResolution": "NodeNext",
"target": "ES2022",
"outDir": "dist",
"rootDir": "src"
}
}
Смысл простой: package.json и tsconfig.json должны говорить об одном и том же формате модулей
Ошибка Cannot find name process
Если TypeScript ругается на process, Buffer, __dirname или NodeJS.Timeout, почти всегда не хватает типов Node.js:
npm install -D @types/node
И проверьте tsconfig.json:
{
"compilerOptions": {
"types": ["node"]
}
}
Если types не указан, TypeScript обычно сам подхватит установленные типы. Но если поле types уже есть, оно ограничивает список подключаемых типов, и node нужно добавить явно
Ошибка из-за strict
Например:
Parameter 'req' implicitly has an 'any' type
Это не ошибка Node.js, а настройка TypeScript. Исправляйте типами:
import type { IncomingMessage, ServerResponse } from "node:http";
function handler(req: IncomingMessage, res: ServerResponse) {
res.end("ok");
}
Не выключайте strict только потому, что появилась первая ошибка. Лучше типизировать границу: параметры функции, результат API, конфиг, переменные окружения
Минимальный рабочий шаблон
{
"scripts": {
"build": "tsc",
"start": "node dist/index.js",
"check": "tsc --noEmit"
},
"devDependencies": {
"@types/node": "latest",
"typescript": "latest"
}
}
src/index.ts:
import { createServer } from "node:http";
createServer((req, res) => {
res.end("Hello TypeScript");
}).listen(3000);
Проверка:
npm run check
npm run build
npm start
Частые ошибки
Первая ошибка — чинить текст ошибки без чтения полного стека. Смотрите первую строку и файл, где ошибка началась
Вторая ошибка — запускать не тот файл: изменили src/index.ts, а запускаете старый dist/index.js
Третья ошибка — смешать module: CommonJS, "type": "module" и разные стили импортов
Четвертая ошибка — забыть @types/node
Пятая ошибка — поставить skipLibCheck и any везде, вместо того чтобы исправить границу типов
Самопроверка
Сделайте отдельную команду npm run check и запускайте ее перед стартом. Если check проходит, но приложение падает, ищите runtime-проблему. Если check падает, сначала чините TypeScript
Что почитать дальше по TypeScript
Если нужен общий маршрут по теме, откройте рубрику TypeScript. Для соседних задач пригодятся эти разборы:
- TypeScript в Node.js: первый Express API
- Как настроить транспайлинг TypeScript в ES6 для Node.js
- Как разрабатывать и отлаживать Telegram-бота на Node.js, NestJS и TypeScript
- 10 вопросов по TypeScript и ответы на них



