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
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.