TypeScript
TypeScript — это надстройка над JavaScript, добавляющая статическую систему типов, инструменты для проверки кода на этапе разработки и улучшенную поддержку крупных проектов. Он компилируется в обычный JS, поэтому запускается везде, где работает JS: в Node.js и в браузере. Ниже — что именно добавляет TS и как стажёру, знакомому только с серверным JS, грамотно на него перейти.
Что добавляет TypeScript поверх JavaScript
Статическая типизация: объявление типов для переменных, параметров, возвращаемых значений функций и структур данных.
Инференс типов: TS умеет выводить типы автоматически, не требуя аннотаций везде.
Проверка на этапе компиляции: ловит опечатки, несоответствия контрактам и потенциальные ошибки ещё до запуска.
Современный синтаксис: поддержка последних возможностей JS (ESNext), включая
import/export
,async/await
, декораторы (экспериментально) и т. п.Инструменты для больших кодовых баз: интерфейсы, дженерики, объединения типов, пересечения типов, утилитные типы.
Более умный редакторский опыт: автодополнение, навигация по коду, рефакторинги и подсказки становятся точнее благодаря типам.
Базовые типы и аннотации
Самые часто используемые типы: string
, number
, boolean
, null
, undefined
, symbol
, bigint
, unknown
, any
, never
, а также object
, массивы T[]
и кортежи [T1, T2]
.
Структурная типизация и контракты
TS использует структурную типизацию: совместимость определяется формой объекта (набором полей), а не именем типа.
Интерфейсы и type-алиасы
И interface
, и type
объявляют формы типов. interface
поддерживает декларативное расширение (merging), type
— более универсален (можно описывать объединения, пересечения и пр.).
Объединения, пересечения, литеральные и перечислимые типы
Сужение типов (type narrowing) и проверки
TS анализирует ветвления и проверки, чтобы «сузить» тип к более конкретному.
Дженерики (обобщения)
Дженерики позволяют писать переиспользуемый код, сохраняющий информацию о типах.
Полезные утилитные типы
Partial<T>
,Required<T>
,Readonly<T>
Pick<T, K>
,Omit<T, K>
Record<K, T>
,NonNullable<T>
,ReturnType<F>
Функции, this и перегрузки
Аннотируйте параметры и возвращаемые значения. Для разных сигнатур используйте перегрузки.
Классы, модификаторы и поля
TS добавляет модификаторы public
, private
, protected
, readonly
, а также поля инициализации прямо в сигнатуре конструктора.
Строгий режим и работа с null/undefined
Включите строгий режим, чтобы компилятор помогал больше: "strict": true
, включая strictNullChecks
.
Переезд с серверного JS на TypeScript — практическая стратегия
Шаг 1. Подготовка окружения
Добавьте TS в проект:
npm i -D typescript
.Инициализируйте конфиг:
npx tsc --init
.Рекомендуемые опции для Node.js-проекта:
{ "compilerOptions": { "target": "ES2020", "module": "NodeNext", "moduleResolution": "NodeNext", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "outDir": "dist", "rootDir": "src", "resolveJsonModule": true, "forceConsistentCasingInFileNames": true }, "include": [ "src" ] }
Шаг 2. Мягкая типизация существующего кода
Включите поддержку JS-файлов в сборке:
"allowJs": true
и, по желанию,"checkJs": true
для постепенной проверки JSDoc-типов.Начните добавлять JSDoc-типы в JS-файлы, не переименовывая их в
.ts
. Это даст подсказки без резкого порога.Постепенно переименовывайте файлы из
.js
в.ts
, начиная с листовых модулей (не переиспользуемых другими).
Шаг 3. Типизация внешних зависимостей
Если пакет не имеет встроенных типов, установите их:
npm i -D @types/<pkg>
.Пишите собственные декларации для внутренних библиотек:
*.d.ts
в папкеtypes
и добавьте её вtypeRoots
, если нужно.
Шаг 4. Ужесточение конфигурации
Включайте строгие флаги постепенно:
noImplicitAny
,noImplicitThis
,strictNullChecks
,noUncheckedIndexedAccess
.Наводите порядок: устраняйте
any
, вводите интерфейсы/типы, покрывайте участки кода тестами.
Шаг 5. Сборка и запуск
В разработке удобно использовать
tsx
илиts-node
:npm i -D tsx # или npm i -D ts-nodeВ продакшн собирайте в JS:
npx tsc node dist/index.js
Лучшие практики для серверного TypeScript
С самого начала включите
"strict": true
и"skipLibCheck": true
(ускоряет сборку, не проверяя внешние типы).Фиксируйте интерфейсы доменных сущностей в
types/
илиdomain/
. Поддерживайте их как «контракты» между модулями.Предпочитайте
unknown
вместоany
на границах ввода (например, при парсинге JSON), затем выполняйте проверку и сужение.Используйте утилитные типы для DTO:
Pick
,Omit
,Partial
, чтобы не дублировать поля.Поддерживайте единый стиль импорта/экспорта (ESM или CJS) и настройте линтер (ESLint) + форматтер (Prettier).
Мини-проект: пример и как запустить
Создадим минимальный сервер на Node.js с TypeScript.
Отредактируем tsconfig.json
(минимально необходимое):
Создадим файл src/index.ts
:
Добавим скрипты в package.json
:
Запуск:
Режим разработки: горячий перезапуск
npm run devСборка и продакшн-запуск:
npm run build npm start