0Pricing
TypeScript Academy · Lekcja

Typy branding/opaque zapobiegające pomyłkom jednostek

Zapobieganie pomyłkom jednostek i tagów przez przecięcie typów bazowych z właściwościami phantom brand; tworzenie wyłącznie za pomocą funkcji fabrykujących

Typy branding/opaque zapobiegające pomyłkom jednostek to bezpłatna lekcja TypeScript Academy na CoddyKit. To lekcja 1 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej TypeScript Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs TypeScript Academy zawiera 3 lekcji w sumie.

Wprowadzenie

Cel: Rozdzielanie podobnie wyglądających wartości na poziomie typów. Zwykły number nie odróżnia metrów od sekund, ale może to zrobić znacznik brand.

  • Brak narzutu w czasie działania
  • Bezpieczniejsze API i refaktoryzacje
  • Tworzenie wyłącznie za pomocą fabryk

Brandowanie jednostek prymitywnych

Znaczniki Brand rozdzielają jednostki podczas sprawdzania typów; nieprawidłowa kolejność argumentów powoduje błąd sprawdzania typów.

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

Generyczna funkcja pomocnicza Brand

Generycznej funkcji pomocniczej Brand można używać w różnych domenach: dla typowanych identyfikatorów, tokenów, kursorów itd.

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

Marka oparta na unique symbol

Marka oparta na unique symbol zapobiega konfliktom nazw i wyciekaniu do globalnych przestrzeni nazw.

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

Fabryki i walidacja

Przekazuj markę wewnątrz fabryki: najpierw waliduj, następnie oznaczaj marką, a na końcu używaj wartości. Unikaj stosowania doraźnego as w miejscach wywołania.

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

Wskazówki i pułapki

Najlepsze praktyki:

  • Niech nazwy marek będą krótkie i znaczące.
  • Udostępniaj fabryki jako jedyny sposób uzyskiwania wartości oznaczonych marką.
  • Nie ujawniaj marek w typach publicznego API, chyba że jest to konieczne.
  • Marki istnieją wyłącznie na poziomie typów, więc nie powodują narzutu w czasie wykonywania.

Sprawdzanie brandowania

Szybkie sprawdzenie: który wzorzec zapobiega pomyleniu jednostek lub znaczników?

Podsumowanie

Podsumowanie: Typy brandowane/nieprzezroczyste rozdzielają podobnie wyglądające wartości (metry i sekundy, UserId i OrderId). Twórz je za pomocą fabryk, używaj ich w API i eliminuj przypadkowe pomyłki.

Często zadawane pytania

Czy lekcja „Typy branding/opaque zapobiegające pomyłkom jednostek” jest bezpłatna?

Tak — pełny tekst „Typy branding/opaque zapobiegające pomyłkom jednostek” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu TypeScript Academy, przejdź na CoddyKit PRO. Kurs TypeScript Academy zawiera 3 lekcji w sumie.

Co nauczysz się w „Typy branding/opaque zapobiegające pomyłkom jednostek”?

Zapobieganie pomyłkom jednostek i tagów przez przecięcie typów bazowych z właściwościami phantom brand; tworzenie wyłącznie za pomocą funkcji fabrykujących Ćwiczysz TypeScript Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć TypeScript Academy?

Nie wymagamy żadnego doświadczenia. TypeScript Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 3.

Ile czasu zajmuje lekcja „Typy branding/opaque zapobiegające pomyłkom jednostek”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji TypeScript Academy?

Tak. Każda lekcja TypeScript Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Typy branding/opaque zapobiegające pomyłkom jednostek
  2. Identyfikatory tagowane i wzorce modelowania domeny
  3. Modelowanie domeny — agregaty, niezmienniki i usługi
← Powrót do TypeScript Academy