3. Когда TypeScript оправдан

TypeScript — не серебряная пуля. Это инструмент управления сложностью, а не способ «починить» слабую архитектуру. Он помогает согласовывать контракты и делает рефакторинг предсказуемым, но не заменяет системный дизайн.

Когда TS имеет смысл:

  • Длинная жизнь продукта и кодовая база, которая растёт годами.
  • Несколько команд, параллельные изменения, обилие внутренних и внешних API.
  • Есть публичные SDK/клиенты, где обратная совместимость — не пожелание, а требование.
  • Стоимость рантайм-ошибки высока: деньги, SLA, безопасность.

Если проект маленький, недолговечный, с узкими интерфейсами — издержки типизации часто превышают пользу.

Что даёт TS:

  • Контракты на границах модулей. Явные типы для DTO, событий, адаптеров. Ломаете поле — компилятор показывает фронт разрушений.
  • Дешёвый рефакторинг. Переименование, выделение интерфейсов, смена сигнатур — IDE и компилятор ведут тебя за руку.
  • Локализация неопределённости. unknown/never/asserts подчёркивают места, где риск и где нужны проверки.
  • Документация, которая не врёт. Типы — это живой, проверяемый артефакт, а не устаревающий README.

Чего TS не даёт:

  • Архитектуры. Границы контекстов, потоки данных, изоляция побочных эффектов — это решения уровня дизайна.
  • Согласованности данных и эволюции схем. Миграции, инварианты и порядок обновления сервисов — за вами.
  • Надёжности. Повторные попытки, идемпотентность, дедупликация событий — это протоколы и инфраструктура.
  • Производительности. Типы не ускоряют обработку запросов и не уменьшают GC-паузы.

Формула простая: TS снижает стоимость изменения, но не подменяет мышцу архитектурного мышления.

Пример:

Рефакторинг поля total в amount в DTO между сервисами orders и billing:

С TS практически сразу будет обозначен фронт проблем во всех местах, где читали total, включая сериализацию, агрегации и тесты. Без TS часть мест «проскочит», всплывёт в проде при редком кейсе.

Контрпример:

В одном модуле сетевая логика, доменная модель и кэш. TS это оттипизирует, но не разрежет связность. По-прежнему сложно независимо тестировать и разворачивать части. TS помогает согласовать и облегчить рефакторинг, но не исправит архитектуру.

Что в итоге?

Используй TS там, где много кода, много людей и много интерфейсов. Там он окупается: контракты формализованы, рефакторинг дешевле, регрессов меньше. Не жди, что TS решит проблемы дизайна — слабые границы, излишнюю связность и плохие протоколы он не лечит.

Если проект небольшой — строгая дисциплина модулей и простые соглашения дадут такой же эффект с меньшими накладными расходами.