interface Spy { (...params: any[]): any; identity: string; and: Function; mostRecentCall: { args: any[]; }; argsForCall: any[]; } type SpyObj = T & { [k in keyof T]: Spy; } declare function createSpyObj( name: string, names: Array): SpyObj; function mock(spyName: string, methodNames: Array): SpyObj { const spyObj = createSpyObj(spyName, methodNames); for (const methodName of methodNames) { spyObj[methodName].and.returnValue(1); } return spyObj; }