Брендированные и непрозрачные типы для предотвращения смешения единиц
Предотвращайте смешение единиц и меток, объединяя базовые типы с фиктивными брендовыми свойствами; создавайте значения только через фабричные функции.
«Брендированные и непрозрачные типы для предотвращения смешения единиц» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 1 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 3 уроков всего.
Введение
Цель: разделять похожие значения на уровне типов. Обычный number не различает метры и секунды; это может сделать маркер бренда.
- Нулевые затраты во время выполнения
- Более безопасные APIs и рефакторинг
- Создание только через фабрики
Брендирование физических единиц
Маркеры бренда разделяют единицы на этапе компиляции; неправильный порядок аргументов не проходит проверку типов.
type Meter = number & { readonly __brand: "meter" }
type Second = number & { readonly __brand: "second" }
function meter(n: number): Meter { return n as Meter }
function second(n: number): Second { return n as Second }
const d = meter(100)
const t = second(9)
function speed(dist: Meter, time: Second) { return (dist as number) / (time as number) }
// speed(t, d) // compile error: brands do not matchОбщий помощник бренда
Используйте универсальный помощник Brand в разных предметных областях: для типизированных идентификаторов, токенов, курсоров и других значений.
type Brand<Tag extends string, T> = T & { readonly __brand: Tag }
type UserId = Brand<"UserId", string>
type OrderId = Brand<"OrderId", string>
function userId(x: string): UserId { return x as UserId }
function orderId(x: string): OrderId { return x as OrderId }
function findUser(id: UserId) { /* ... */ }
const u = userId("u_123")
const o = orderId("o_456")
// findUser(o) // error: OrderId not assignable to UserIdБренд уникального символа
Бренд уникального символа предотвращает конфликты имён и утечки в глобальные пространства имён.
declare const MeterSym: unique symbol
type Meter2 = number & { readonly [MeterSym]: "meter" }
function asMeter2(n: number): Meter2 { return n as Meter2 }
const m2 = asMeter2(5)
// const wrong: Meter2 = 5 // discourage raw assignment; prefer factoriesФабрики и проверка
Поместите бренд внутрь фабрики: сначала проверьте, затем добавьте бренд, а потом используйте значение. Избегайте ситуативного as в местах вызова.
type NonEmptyString = string & { readonly __brand: "NonEmpty" }
function nonEmpty(s: string): NonEmptyString | null {
return s.trim().length > 0 ? (s as NonEmptyString) : null
}
function makeSlug(s: NonEmptyString) {
return (s as string).toLowerCase().replace(/\s+/g, "-")
}
const ok = nonEmpty(" Hello ")
if (ok) { makeSlug(ok) } // safe: validated & branded firstСоветы и подводные камни
Рекомендации:
- Делайте имена брендов короткими и содержательными.
- Предоставляйте фабрики как единственный способ получить значения с брендом.
- Не раскрывайте бренды в типах общедоступного API без необходимости.
- Бренды существуют только на уровне типов и не создают накладных расходов во время выполнения.
Проверка брендов
Быстрая проверка: какой шаблон предотвращает путаницу единиц измерения и тегов?
Повторение
Повторение: Типы с брендами и непрозрачные типы разделяют похожие значения (метры и секунды, UserId и OrderId). Создавайте их через фабрики, используйте в API и исключайте случайную путаницу.
Часто задаваемые вопросы
Урок «Брендированные и непрозрачные типы для предотвращения смешения единиц» бесплатный?
Да — полный текст урока «Брендированные и непрозрачные типы для предотвращения смешения единиц» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 3 уроков всего.
Чему я научусь в уроке «Брендированные и непрозрачные типы для предотвращения смешения единиц»?
Предотвращайте смешение единиц и меток, объединяя базовые типы с фиктивными брендовыми свойствами; создавайте значения только через фабричные функции. Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать TypeScript Academy?
Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 3.
Сколько времени занимает урок «Брендированные и непрозрачные типы для предотвращения смешения единиц»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке TypeScript Academy?
Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Брендированные и непрозрачные типы для предотвращения смешения единиц
- Идентификаторы с метками и шаблоны предметного моделирования
- Моделирование предметной области — агрегаты, инварианты и службы