export interface DebouncedFunction any> { (...args: Parameters): void; reset(...args: Parameters): void; } export function debounce any>( callback: T, delay: number ): DebouncedFunction { let timer: ReturnType | undefined; const result = function (this: any, ...args: Parameters): void { const context = this; clearTimeout(timer); timer = setTimeout(() => { callback.apply(context, args); }, delay); } as DebouncedFunction; result.reset = function (this: any, ...args: Parameters): void { clearTimeout(timer); callback.apply(this, args); }; return result; }