Управление типами
Цель
Типизация - обязательный механизм, обеспечивающий предсказуемость, безопасность рефакторинга и согласованность с API.
Типы используются как контракт, а не как “подсказка для редактора”.
Типы должны:
- описывать реальные данные, а не “желаемое поведение”
- синхронизироваться с API
- предотвращать расхождения между ожидаемыми и фактическими структурами данных
- упрощать навигацию и понимание предметной области проекта
Общие правила
MUST
- TypeScript используется в strict mode.
- Любые данные, полученные извне модуля (даже в пределах одного репозитория), считаются недоверенными.
- Типизация не должна “маскировать” потенциально некорректные данные.
- Отсутствие уверенного типа (
unknown) предпочтительнее некорректного типа.
FORBIDDEN
anyunknownбез последующей проверки (assert / type guard / schema validation)- type casting (
as) для обхода ошибок компилятораДопускается только в редких случаях, локально и с техническим обоснованием. Предпочтительнее - type predicates / guards.
- "типизация на глаз", не отражающая реальную структуру данных
Любая настройка генерации/типизационного процесса требует согласования с Tech Lead и PM.
Описание подходов к типизации
1) OpenAPI генерация DTO (MUST, если OpenAPI актуальна)
Принцип
Если у бэкенда есть OpenAPI (Swagger) и она поддерживается актуальной, DTO типы обязаны генерироваться автоматически.
Плюсы
- максимальная синхронизация FE/BE
- меньше ручных ошибок и риска рассинхрона
- быстрый рефакторинг при изменениях API благодаря static typing
Минусы
- нужно поддерживать механизм генерации
- возможны неудобные названия/структуры типов, решается маппингом (mapper layer)
Важное правило: generated types не коммитятся
MUST
- Сгенерированные типы не должны коммититься в репозиторий проекта, чтобы:
- не было “искушения” править их руками
- типы всегда соответствовали источнику истины