typescript / expert
Snippet
Gegenseitige Ausschluss-Typen mittels distributiver bedingter Filterung
Standard-Unions in TypeScript erlauben Objekte, die Eigenschaften zweier Schnittstellen gleichzeitig enthalten. Das XOR-Hilfskonstrukt erzwingt einen strikten gegenseitigen Ausschluss mithilfe von Mapped Types und optionalen 'never'-Eigenschaften. Dadurch wird verhindert, dass Schlüssel von Interface U übergeben werden, wenn Interface T bereitgestellt wird.
snippet.ts
typescript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
type Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };type XOR<T, U> = (T | U) extends object? (Without<T, U> & U) | (Without<U, T> & T): T | U;interface CreditCardPayment {cardNumber: string;cvv: string;}interface PayPalPayment {paypalEmail: string;authToken: string;}type PaymentMethod = XOR<CreditCardPayment, PayPalPayment>;function processPayment(payment: PaymentMethod): void {if ('cardNumber' in payment) {console.log(`Processing card ${payment.cardNumber}`);} else {console.log(`Processing PayPal ${payment.paypalEmail}`);}}
Erklärung
1
type Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };
Erstellt einen Typ, bei dem in T vorhandene, aber in U fehlende Schlüssel explizit auf optionales 'never' abgebildet werden.
2
type XOR<T, U> = (T | U) extends object
Wendet sich distributiv auf Objekttypen an, um sich gegenseitig ausschließende Schnittmengen-Varianten zu bilden.
3
type PaymentMethod = XOR<CreditCardPayment, PayPalPayment>;
Verhindert die zeitgleiche Angabe von PayPal- und Kreditkartenfeldern in einem einzelnen Zahlungsobjekt.
4
if ('cardNumber' in payment)
Dient als Type Guard zur sicheren Verfeinerung der XOR-Union auf eine spezifische Zahlungsoption.