export type ParaOrNoting = T extends (...args: any) => any ? Parameters : []; export type ReturnOrID = T extends (...args: any) => any ? ReturnType : T; export function proxied(x: T, ex: { [k in keyof T]?: (req: ParaOrNoting, next: T[k]) => ReturnOrID }) { return new Proxy(x, { get(target, p) { if (ex[p]) { if (typeof target[p] === 'function') { return (...args) => ex[p](args, (...x) => target[p].call(target, ...x)); } else { return ex[p]([], target[p]); } } return target[p]; }, }); }