export type Spy any> = T & { uses: any[][]; }; export function spy any>(impl: T): Spy { const uses: any[][] = []; const apply = (...args: any[]): any => { uses.push(args); return impl(...args); }; return Object.assign(apply, { uses }) as Spy; }