export interface ThrottleCallback any> { (...args: Parameters): ReturnType; enforce: F; } export function throttle any>(interval: number, cb: F): ThrottleCallback { let _waiting = false; let _result: ReturnType | undefined = void 0; let ret = function (...args: Parameters) { if (_waiting) return _result!; _waiting = true; _result = cb(...args); setTimeout(() => _waiting = false, interval); return _result! } return Object.assign(ret, { enforce: cb }); }