Branding-/opaque-typer för att förhindra sammanblandning av enheter
Förhindra sammanblandning av enheter eller taggar genom att kombinera bastyper med phantom-brandegenskaper. Skapa dem endast via fabriksfunktioner.
Branding-/opaque-typer för att förhindra sammanblandning av enheter är en gratis lektion i TypeScript Academy på CoddyKit. Detta är lektion 1 av 3. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för TypeScript Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i TypeScript Academy innehåller totalt 3 lektioner.
Introduktion
Mål: Skilj värden som ser likadana ut åt på typnivå. En vanlig number kan inte skilja meter från sekunder; en brand-markör kan det.
- Ingen extra kostnad vid körning
- Säkrare API:er och refaktoreringar
- Skapa endast via fabriker
Branda primitiva enheter
Brand-markörer håller isär enheter vid kompilering; fel argumentordning leder till ett typkontrollfel.
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 matchGenerisk brand-hjälpfunktion
Använd en generisk Brand-hjälpfunktion i olika domäner: typade ID:n, token, cursors och så vidare.
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 UserIdVarumärke med unique symbol
Ett varumärke med unique symbol förhindrar namnkonflikter och läckage till globala namnrymder.
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 factoriesFabriker och validering
Lägg in varumärket i en factory: validera först, märk sedan och använd därefter. Undvik ad hoc-as på anropsställena.
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 firstTips och fallgropar
Bästa praxis:
- Håll brandnamnen korta och meningsfulla.
- Exponera fabriker som det enda sättet att skapa brandade värden.
- Låt inte brand läcka ut i offentliga API-typer om det inte behövs.
- Brand finns endast på typsystemnivå: ingen kostnad vid körning.
Kontroll av brandning
Snabb kontroll: Vilket mönster förhindrar att enheter och taggar blandas ihop?
Sammanfattning
Sammanfattning: Brandade/opaqua typer skiljer åt värden som ser likadana ut (meter och sekunder, UserId och OrderId). Skapa dem via fabriker, använd dem i API:er och eliminera oavsiktliga sammanblandningar.
Lär dig TypeScript med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 101
- Lektioner
- 352
Vanliga frågor
Är lektionen ”Branding-/opaque-typer för att förhindra sammanblandning av enheter” gratis?
Ja – hela texten till ”Branding-/opaque-typer för att förhindra sammanblandning av enheter” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i TypeScript Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i TypeScript Academy innehåller totalt 3 lektioner.
Vad lär jag mig i ”Branding-/opaque-typer för att förhindra sammanblandning av enheter”?
Förhindra sammanblandning av enheter eller taggar genom att kombinera bastyper med phantom-brandegenskaper. Skapa dem endast via fabriksfunktioner. Ni övar på TypeScript Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig TypeScript Academy?
Du behöver inga förkunskaper. Utbildningen i TypeScript Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 3.
Hur lång tid tar lektionen ”Branding-/opaque-typer för att förhindra sammanblandning av enheter”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här TypeScript Academy-lektionen?
Ja. Varje TypeScript Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Branding-/opaque-typer för att förhindra sammanblandning av enheter
- Taggade ID:n och mönster för domänmodellering
- Domänmodellering – aggregat, invarianta villkor och tjänster