typescript / expert
Snippet
Endrekursive bedingte Typen für ablaufoptimierte Typverarbeitung
TypeScript 4.5+ optimiert rekursive bedingte Typen, wenn diese nach dem Muster der Endrekursion (Tail-Call Optimization) aufgebaut sind. Durch die Übergabe eines Akkumulator-Typparameters (Acc) verhindert der Compiler das Überschreiten der maximalen Aufrufstapeltiefe bei der Transformation großer Tupel-Strukturen zur Kompilierzeit.
snippet.ts
typescript
1
2
3
4
5
6
7
8
9
10
11
type TailRecReverse<T extends readonly unknown[], Acc extends readonly unknown[] = []> =T extends readonly [infer Head, ...infer Tail]? TailRecReverse<Tail, [Head, ...Acc]>: Acc;type AssertEqual<T, U> = [T] extends [U] ? ([U] extends [T] ? true : false) : false;type SampleTuple = readonly [string, number, boolean, symbol];type Reversed = TailRecReverse<SampleTuple>;type IsCorrect = AssertEqual<Reversed, readonly [symbol, boolean, number, string]>;const testPass: IsCorrect = true;
Erklärung
1
type TailRecReverse<T extends readonly unknown[], Acc extends readonly unknown[] = []> =
Definiert einen generischen Typen, der ein schreibgeschütztes Tupel und ein Akkumulator-Array entgegennimmt.
2
T extends readonly [infer Head, ...infer Tail]
Führt ein Muster-Matching durch, um das erste Element (Head) und die Verbleibenden (Tail) zu extrahieren.
3
? TailRecReverse<Tail, [Head, ...Acc]>
Ruf den Typen endrekursiv auf, indem Head dem Akkumulator vorangestellt wird.
4
type AssertEqual<T, U> = [T] extends [U] ? ([U] extends [T] ? true : false) : false;
Überprüft die strukturelle Gleichheit zweier Typen zur Kompilierzeit ohne distributives Verhalten.