Настройка TypeScript-проекта через npm и конфигурацию tsconfig.json для управления компиляцией.
Зачем нужно
- Без установки TypeScript нельзя компилировать
.ts файлы
tsconfig.json определяет правила компиляции, строгость проверок и структуру проекта
- Правильная конфигурация — фундамент надёжного TS-проекта
Где используется
- Любой TypeScript-проект начинается с
npm init + npm install typescript
tsconfig.json лежит в корне каждого TS-проекта
- Монорепозитории используют project references для связи нескольких
tsconfig.json
Предпосылки
Установка TypeScript
Глобальная установка (для экспериментов)
npm install -g typescript
tsc --version
Локальная установка (рекомендуется для проектов)
mkdir my-ts-project && cd my-ts-project
npm init -y
npm install --save-dev typescript
npx tsc --version
Установка с полезными дополнениями
npm install --save-dev typescript @types/node ts-node
npm install --save-dev typescript @types/node tsx
Инициализация tsconfig.json
npx tsc --init
Структура tsconfig.json
{
"compilerOptions": {
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist", "**/*.test.ts"],
"files": ["src/index.ts"],
"references": [{ "path": "../shared" }],
"extends": "@tsconfig/node20/tsconfig.json"
}
Ключевые опции компилятора
target — версия JavaScript на выходе
{
"compilerOptions": {
"target": "ES2022"
}
}
| Значение |
Когда использовать |
ES5 |
Поддержка старых браузеров |
ES2020 |
Современные браузеры |
ES2022 |
Node.js 18+ |
ESNext |
Всегда последняя версия |
module — система модулей
{
"compilerOptions": {
"module": "ESNext"
}
}
| Значение |
Когда использовать |
CommonJS |
Старый Node.js (require/module.exports) |
ESNext |
Бандлеры (Vite, webpack, esbuild) |
Node16 / NodeNext |
Node.js 16+ с ESM |
strict — строгая проверка типов
{
"compilerOptions": {
"strict": true
}
}
outDir и rootDir — структура папок
{
"compilerOptions": {
"rootDir": "./src",
"outDir": "./dist"
}
}
my-project/
├── src/ ← rootDir
│ ├── index.ts
│ └── utils/
│ └── helpers.ts
├── dist/ ← outDir (создаётся автоматически)
│ ├── index.js
│ └── utils/
│ └── helpers.js
└── tsconfig.json
esModuleInterop — совместимость импортов
{
"compilerOptions": {
"esModuleInterop": true
}
}
import * as express from "express";
import express from "express";
jsx — поддержка JSX/TSX
{
"compilerOptions": {
"jsx": "react-jsx"
}
}
Другие важные опции
{
"compilerOptions": {
"moduleResolution": "bundler",
"baseUrl": ".",
"paths": {
"@/*": ["src/*"],
"@utils/*": ["src/utils/*"]
},
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"sourceMap": true,
"declaration": true,
"declarationMap": true,
"incremental": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"skipLibCheck": true
}
}
Готовые конфигурации для разных сценариев
Frontend (React + Vite)
{
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"moduleResolution": "bundler",
"jsx": "react-jsx",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
},
"include": ["src"],
"exclude": ["node_modules"]
}
Backend (Node.js)
{
"compilerOptions": {
"target": "ES2022",
"module": "Node16",
"moduleResolution": "Node16",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"outDir": "./dist",
"rootDir": "./src",
"declaration": true,
"sourceMap": true,
"incremental": true
},
"include": ["src"],
"exclude": ["node_modules", "dist"]
}
Библиотека (npm-пакет)
{
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"moduleResolution": "bundler",
"strict": true,
"declaration": true,
"declarationMap": true,
"sourceMap": true,
"outDir": "./dist",
"rootDir": "./src",
"esModuleInterop": true,
"skipLibCheck": true
},
"include": ["src"],
"exclude": ["node_modules", "dist", "**/*.test.ts"]
}
Project References (монорепо)
{
"references": [
{ "path": "./packages/shared" },
{ "path": "./packages/client" },
{ "path": "./packages/server" }
],
"files":
}
{
"compilerOptions": {
"composite": true,
"outDir": "./dist",
"rootDir": "./src",
"declaration": true
},
"include": ["src"]
}
{
"compilerOptions": {
"composite": true,
"outDir": "./dist",
"rootDir": "./src"
},
"references": [
{ "path": "../shared" }
],
"include": ["src"]
}
npx tsc --build
npx tsc -b
Наследование конфигураций (extends)
npm install --save-dev @tsconfig/node20
npm install --save-dev @tsconfig/strictest
{
"extends": "@tsconfig/node20/tsconfig.json",
"compilerOptions": {
"outDir": "./dist",
"rootDir": "./src"
},
"include": ["src"]
}
Частые ошибки
- Не указан
include или files — компилятор подхватит все .ts в проекте, включая node_modules
rootDir не совпадает с реальной структурой — пути в dist будут неожиданными
- Забыт
esModuleInterop — импорты CommonJS-модулей ломаются
strict: false в новом проекте — всегда начинайте со strict: true
- Не установлены
@types/* — TypeScript не знает типы сторонних библиотек
npm install --save-dev @types/express
- Конфликт
module и moduleResolution — используйте совместимые пары:
"module": "CommonJS" + "moduleResolution": "node"
"module": "Node16" + "moduleResolution": "Node16"
"module": "ESNext" + "moduleResolution": "bundler"
Практика
- Создайте новый проект:
mkdir ts-practice && cd ts-practice
npm init -y
npm install --save-dev typescript @types/node
npx tsc --init
- Настройте
tsconfig.json для Node.js проекта
- Создайте
src/index.ts с простой функцией
- Скомпилируйте:
npx tsc
- Проверьте вывод в
dist/
- Попробуйте изменить
target на ES5 и сравните вывод
Связанные темы
Ресурсы