typescript / expert
Snippet
Variadische Tupel-Inferenz für typsichere Middleware-Pipelines
Dieses Design zeigt, wie asynchrone Middleware-Komposition in Framework-Engines typisiert werden kann. Die funktionale rekursive Iteration mit Next-Handlern gewährleistet kontrollierte kontextuelle Transformationen über asynchrone Operationen hinweg.
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
type Middleware<TContext> = (ctx: TContext, next: () => Promise<void>) => Promise<void>;class Pipeline<TContext> {private middlewares: Middleware<TContext>[] = [];use(...fns: Middleware<TContext>[]): this {this.middlewares.push(...fns);return this;}async execute(ctx: TContext): Promise<void> {const runner = async (index: number): Promise<void> => {if (index >= this.middlewares.length) return;const mw = this.middlewares[index];await mw(ctx, () => runner(index + 1));};await runner(0);}}interface HttpContext { reqId: string; status?: number; }const pipeline = new Pipeline<HttpContext>().use(async (ctx, next) => {ctx.status = 200;await next();});
Erklärung
1
type Middleware<TContext> = (ctx: TContext, next: () => Promise<void>) => Promise<void>;
Spezifiziert einen stark typisierten Middleware-Handler-Vertrag, der Kontext und einen nachgelagerten Next-Executor akzeptiert.
2
use(...fns: Middleware<TContext>[]): this
Ermöglicht verkettbare Registrierung durch variadische Parametersammlung, eingeschränkt auf gültige Middleware-Signaturen.
3
const runner = async (index: number): Promise<void> => {
Kapselt den internen rekursiven Ausführungszeiger über gespeicherte Middleware-Funktionen.
4
await mw(ctx, () => runner(index + 1));
Übergibt die Kontrolle an die nächste Middleware in der Sequenz, wenn der Benutzer next() aufruft.