0Pricing
TypeScript Academy · Урок

Брендированные и непрозрачные типы для предотвращения смешения единиц

Предотвращайте смешение единиц и меток, объединяя базовые типы с фиктивными брендовыми свойствами; создавайте значения только через фабричные функции.

«Брендированные и непрозрачные типы для предотвращения смешения единиц» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Брендированные и непрозрачные типы для предотвращения смешения единиц
  2. Идентификаторы с метками и шаблоны предметного моделирования
  3. Моделирование предметной области — агрегаты, инварианты и службы
← Назад к TypeScript Academy