type Next any> = (...args: Parameters) => ReturnType; type Middleware any> = (context: Parameters, next: Next) => ReturnType; const pipe = any>(fn: T) => (...args: Parameters): ReturnType => fn(...args); export const use = any>(fn: T, middleware: Middleware): T => function (this: unknown, ...context: Parameters): ReturnType { return middleware(context, pipe(fn.bind(this))); } as T;