capypad
0 Tage Serie
typescript / expert
Snippet

Fortgeschrittene Inferenz mit kontravarianten Parametern

Dieses Experten-Snippet zeigt, wie man einen Union-Typ in einen Intersection-Typ umwandelt. Es nutzt die Tatsache aus, dass Funktionsparameter kontravariant sind, was TypeScript dazu zwingt, mehrere Union-Mitglieder während der Inferenz zu einer einzigen Intersection zu vereinen.

snippet.ts
typescript
1
2
3
4
5
6
type UnionToIntersection<U> =
(U extends any ? (k: U) => void : never) extends
((k: infer I) => void) ? I : never;
 
type Result = UnionToIntersection<{ a: 1 } | { b: 2 }>;
// Result: { a: 1 } & { b: 2 }
Erklärung
1
(U extends any ? (k: U) => void : never)
Verteilt die Union in eine Union von Funktionen.
2
extends ((k: infer I) => void) ? I : never
Inferiert den Parametertyp. Da dieser sich in einer kontravarianten Position befindet, wird die Union zu einer Intersection verschmolzen.