typescript / expert
Snippet
Typ-sichere variadische Kompositionspipeline mit Infer und Tupel-Spreads
Dieses Beispiel zeigt die rekursive generische bedingte Typdeduktion zur Typisierung einer variadischen Pipe-Funktion. Es prüft Funktionsargumente Element für Element mittels bedingter `infer`-Typen auf Tupel-Arrays und stellt eine strikte Typverkettung von Ausgaben zu Eingaben sicher.
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
26
27
28
29
30
type Func = (arg: any) => any;type Pipeline<F extends Func[]> = F extends [(arg: infer A) => infer B,...infer Rest]? Rest extends Func[]? (arg: A) => PipelineResult<B, Rest>: never: unknown;type PipelineResult<Input, F extends Func[]> = F extends [(arg: Input) => infer Next,...infer Rest]? Rest extends Func[]? PipelineResult<Next, Rest>: Next: Input;function pipe<F extends Func[]>(...fns: F): Pipeline<F> {return ((initial: any) =>fns.reduce((acc, fn) => fn(acc), initial)) as Pipeline<F>;}const processNumber = pipe((x: number) => x * 2,(x: number) => x.toString(),(x: string) => x.padStart(5, '0'));
Erklärung
1
type Pipeline<F extends Func[]> = F extends [ (arg: infer A) => infer B, ...infer Rest ]
Extrahiert den ersten Argumenttyp A und den Rückgabetyp B mittels Tupel-Head/Tail-Destrukturierung.
2
type PipelineResult<Input, F extends Func[]> = ...
Prüft rekursiv, ob der Rückgabetyp jeder Funktion mit dem Argumenttyp der folgenden Funktion übereinstimmt.
3
fns.reduce((acc, fn) => fn(acc), initial)
Führt Funktionen zur Laufzeit nacheinander mit einer speichereffizienten Array-reduce-Schleife aus.
4
const processNumber = pipe(...)
Erzeugt eine strikt typisierte Pipeline mit vollständiger Typinferenz vom Zahleneingang zum String-Ausgang.