
Брендированные типы (Branded Types) в TypeScript
Что такое брендированные типы в TypeScript?
Брендированные типы — это паттерн в TypeScript, позволяющий повысить безопасность типов, добавляя уникальные метки к существующим типам (например, string
или number
).
Это особенно полезно, когда несколько значений имеют одинаковый базовый тип, но несут разную семантическую нагрузку — например, UserId
, PostId
, OrderId
.
Несмотря на то что на уровне выполнения это всё те же строки или числа, компилятор TypeScript воспринимает их как разные типы. Это предотвращает случайную подстановку одного значения вместо другого.
Зачем нужны брендированные типы?
TypeScript обеспечивает структурную типизацию — тип считается корректным, если у него есть нужные поля, независимо от его имени. Это может привести к ошибкам, когда два значения совместимы по структуре, но не по смыслу. Например:
С брендированными типами TypeScript «поймёт» ошибку на этапе компиляции:
Как создать брендированный тип?
Существует несколько подходов. Простейший — через пересечение типов с объектом-брендом:
Чтобы избежать дублирования имён и скрыть бренд от автодополнения в редакторе, можно использовать unique symbol
:
Преимущества брендированных типов
- ✅ Повышенная безопасность типов (type safety): предотвращают подстановку несовместимых значений.
- 📖 Ясность кода: код становится самодокументируемым —
UserId
,OrderId
говорят сами за себя, упрощают понимание, поддержку и рефакторинг кода - 🧪 Простота тестирования и валидации: можно создавать отдельные функции-валидаторы, возвращающие брендированный тип только при успешной проверке.
Ограничения
- 🧱 Бренды — это compile-time метки: во время выполнения они не существуют.
- 💡 Можно случайно обойти типизацию, используя
as
без валидации — будьте осторожны. - 🧠 Требуется внимание разработчиков: особенно в больших командах важно соблюдать договорённости при создании брендированных типов.
Применение на практике
1. Разделение ID-шников
2. Валидация пользовательского ввода
3. Работа с числовыми значениями, например, возрастом
Заключение
Branded Types — это мощный приём TypeScript, позволяющий повысить читаемость, надёжность и безопасность кода. Несмотря на то, что они не влияют на выполнение, их сила в compile-time проверках, помогающих предотвратить трудноуловимые ошибки.
Используйте брендированные типы там, где одинаковые по структуре значения имеют разное семантическое значение. Это особенно важно в больших приложениях, API-интеграциях и при валидации пользовательского ввода.