capypad
0 Tage Serie
typescript / expert
Snippet

Nominale Typisierung durch Branded Types

TypeScript verwendet strukturelle Typisierung, aber manchmal benötigen wir nominale Typisierung, um das versehentliche Mischen logisch unterschiedlicher Primitivtypen (wie Währungen oder IDs) zu verhindern. Branding 'markiert' einen Typ mit einer eindeutigen Eigenschaft, die zur Laufzeit nicht existiert, aber zur Kompilierzeit eine strikte Trennung erzwingt.

snippet.ts
typescript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
type Brand<K, T> = K & { __brand: T };
 
type USD = Brand<number, "USD">;
type EUR = Brand<number, "EUR">;
 
const usd = 10 as USD;
const eur = 10 as EUR;
 
function addUSD(a: USD, b: USD): USD {
return (a + b) as USD;
}
 
// Error: Argument of type 'EUR' is not assignable to 'USD'
// addUSD(usd, eur);
Erklärung
1
type Brand<K, T> = K & { __brand: T };
Erstellt einen Intersection-Typ, der den Basistyp mit einer Phantom-Eigenschaft kombiniert, die nur für die Typprüfung verwendet wird.
2
const usd = 10 as USD;
Eine Type-Assertion ist erforderlich, um den Primitivwert zu 'branden', da die __brand-Eigenschaft bei einer einfachen Zahl nicht existiert.