← назад к разделу

TypeScript — это не отдельная программа, которая запускает ваш код. Браузер и сервер выполняют обычный JavaScript, а TypeScript добавляется поверх как слой типов и компилятор. Чтобы начать, нужно собрать небольшой набор инструментов: среду выполнения, менеджер пакетов, компилятор и его настройку. Разберём каждый по очереди.

Node — среда выполнения

Node.js — это среда, в которой JavaScript выполняется вне браузера, на сервере. Когда вы пишете backend на TypeScript, код в итоге исполняет именно Node.

Версии Node нумеруются чётными LTS-релизами (Long Term Support — долгая поддержка): 18, 20, 22. Для нового проекта берите актуальный LTS — на момент написания это Node 20. Чётные версии стабильны и поддерживаются годами, нечётные — экспериментальные, для продакшена их не используют.

Проверить установленную версию:

node --version   # v20.x.x

Запустить файл напрямую Node умеет, но только если это уже JavaScript:

node app.js

Файл .ts Node «из коробки» не понимает — его сначала нужно либо скомпилировать, либо запустить через специальный загрузчик (об этом ниже).

Чтобы не привязываться к одной версии Node на машине, удобно ставить менеджер версий — nvm (или fnm). Он позволяет держать несколько версий и переключаться между проектами.

npm и pnpm — менеджеры пакетов

Любой реальный проект зависит от чужих библиотек. npm (Node Package Manager) — встроенный в Node инструмент, который их скачивает и хранит. Список зависимостей и команд проекта описан в файле package.json.

Инициализация нового проекта:

npm init -y          # создаёт package.json с настройками по умолчанию
npm install express  # ставит библиотеку и записывает её в package.json

Установленные пакеты складываются в папку node_modules/ (её не коммитят в git), а точные версии фиксируются в package-lock.json — чтобы у всех в команде собралось одно и то же.

pnpm — альтернативный менеджер, совместимый с npm по командам, но хранящий пакеты эффективнее: общий кеш на всю машину вместо копии в каждом проекте. На больших проектах он заметно экономит место и время установки.

pnpm install        # то же, что npm install, но быстрее и компактнее
pnpm add express

Команды почти одинаковые: install, add, remove. Выбор между ними — вопрос предпочтений команды; начать можно с npm, он уже есть вместе с Node.

Свои скрипты проекта описываются в разделе scripts файла package.json и запускаются через npm run:

{
  "scripts": {
    "build": "tsc",
    "start": "node dist/app.js"
  }
}
npm run build   # запустит tsc

tsc — компилятор TypeScript

tsc (TypeScript Compiler) — это программа, которая берёт ваши .ts-файлы, проверяет типы и превращает код в обычный JavaScript, понятный Node. Сам TypeScript ставится как зависимость разработки:

npm install --save-dev typescript   # -D — то же сокращённо
npx tsc --version                    # 5.x.x

Флаг --save-dev (-D) означает, что пакет нужен только при разработке, а не во время работы приложения. npx запускает локально установленную версию из node_modules.

Скомпилировать один файл:

npx tsc app.ts   # создаст рядом app.js

На практике файлы по одному не компилируют — настройку всего проекта задают в отдельном файле.

tsconfig.json — настройка компилятора

tsconfig.json описывает, как именно компилировать проект: какие файлы брать, в какую версию JavaScript превращать и насколько строго проверять типы. Создать заготовку:

npx tsc --init

Файл получается большим, но на старте важны несколько ключевых опций:

{
  "compilerOptions": {
    "target": "ES2022",        // в какую версию JS компилировать
    "module": "NodeNext",      // как описывать импорты/экспорты
    "strict": true,            // включить все строгие проверки типов
    "outDir": "dist",          // куда складывать результат
    "rootDir": "src"           // где лежат исходники
  }
}

Разберём главные:

  • target — версия JavaScript на выходе. ES2022 хорошо подходит для Node 20: современный синтаксис без лишней совместимости со старыми браузерами.
  • module — как организованы модули (импорты и экспорты). Для backend на Node актуальное значение — NodeNext.
  • strict — самая важная опция. Включает сразу набор строгих проверок (запрет неявного any, контроль null и undefined и другие). Короткая формула: всегда начинайте новый проект со strict: true — иначе теряется половина пользы от TypeScript.

После настройки достаточно одной команды без аргументов — tsc сам найдёт tsconfig.json и соберёт весь проект:

npx tsc

ts-node и tsx — запуск без отдельной сборки

Каждый раз компилировать проект ради проверки одной правки — медленно. Для разработки удобнее запускать .ts напрямую.

ts-node и tsx — инструменты, которые компилируют TypeScript на лету и сразу выполняют его в Node, без ручного вызова tsc. tsx новее и быстрее, его проще настроить:

npm install -D tsx
npx tsx src/app.ts        # запустит TypeScript-файл сразу
npx tsx watch src/app.ts  # перезапуск при каждом изменении файла

Важно понимать разделение: tsx — для разработки (быстро запустить и проверить), tsc — для сборки релизной версии в папку dist, которую потом исполняет чистый Node. Многие команды tsx используют только локально, а проверку типов в сборке всё равно делают через tsc.

Структура TypeScript-проекта

Типичный минимальный проект выглядит так:

my-app/
├── src/             # исходники .ts
│   └── app.ts
├── dist/            # результат компиляции (в .gitignore)
├── node_modules/    # зависимости (в .gitignore)
├── package.json     # зависимости и скрипты
├── package-lock.json
└── tsconfig.json    # настройка компилятора

Логика проста: пишете в src/, компилятор кладёт готовый JavaScript в dist/, Node запускает то, что в dist/. Папки dist/ и node_modules/ восстанавливаются командой сборки и установки, поэтому в git их не хранят.

Линтеры и форматтеры

Когда основа собрана, добавляют два инструмента качества кода — это уже не обязательный минимум, но в реальных проектах есть почти всегда.

  • ESLint — линтер: ищет подозрительные места и нарушения правил (неиспользуемые переменные, опасные конструкции). Он анализирует код и подсказывает, что переписать.
  • Prettier — форматтер: автоматически приводит код к единому виду (отступы, кавычки, переносы). Он не ищет ошибки, а наводит порядок в оформлении.

Роли не пересекаются: ESLint отвечает за «как написано по сути», Prettier — за «как выглядит». Их обычно настраивают вместе и подключают к редактору, чтобы форматирование и проверки срабатывали при сохранении файла.

Коротко

  • Node — среда, которая исполняет JavaScript на сервере; берите актуальный LTS (Node 20). Файлы .ts напрямую не запускает.
  • npm (встроен) и pnpm (быстрее, компактнее) ставят зависимости; список и скрипты — в package.json.
  • tsc компилирует .ts в .js с проверкой типов; настройка — в tsconfig.json.
  • Ключевые опции tsconfig: target (версия JS), module (NodeNext для Node), strict (всегда включать).
  • tsx запускает TypeScript на лету для разработки; tsc собирает релиз в dist/.
  • Структура: исходники в src/, результат в dist/, зависимости в node_modules/ (последние две — в .gitignore).
  • ESLint ловит ошибки по сути, Prettier форматирует оформление — разные задачи, работают вместе.

Что почитать дальше

  • Модули и npm — как устроены импорты, экспорты и работа с пакетами.
  • Основы типов — что именно проверяет компилятор, ради чего нужен strict.
  • Что нужно знать про JavaScript — база языка, поверх которого работает TypeScript.