typescript / expert
Snippet
Konvertierung von Union zu Intersection zur Extraktion kontravarianter Handler
Durch Ausnutzung der Kontravarianz von Funktionsargumenten in bedingten infer-Positionen wandelt diese Technik eine Typ-Union A | B in eine Schnittmenge (Intersection) A & B um. Dies ermöglicht die Generierung von Funktionssignaturen mit mehreren Überladungen zur Kompilierzeit, die alle Union-Bestandteile gleichzeitig akzeptieren müssen.
snippet.ts
typescript
1
2
3
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;type EventPayloads = { type: 'click'; x: number } | { type: 'hover'; target: string };type CombinedHandler = UnionToIntersection<EventPayloads extends infer E ? (event: E) => void : never>;
Erklärung
1
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;
Verteilt U in Funktionsparameter, wodurch TypeScript I aufgrund von Kontravarianz als Schnittmenge inferiert.
2
type EventPayloads = { type: 'click'; x: number } | { type: 'hover'; target: string };
Definiert eine diskriminierte Union unterschiedlicher Event-Payload-Strukturen.
3
type CombinedHandler = UnionToIntersection<EventPayloads extends infer E ? (event: E) => void : never>;
Erzeugt einen einzelnen Funktionstyp mit einem Event-Parameter, der beide Event-Payloads gleichzeitig erfüllen muss.