export type ThrottledFunction any> = (...args: Parameters) => void; export function throttle any>(func: T, ms: number): ThrottledFunction { let isThrottled = false; let savedArgs: Parameters | null; let savedThis: any; function wrapper(this: any, ...args: Parameters) { if (isThrottled) { savedArgs = args; savedThis = this; return; } func.apply(this, args); isThrottled = true; setTimeout(function () { isThrottled = false; if (savedArgs) { wrapper.apply(savedThis, savedArgs); savedArgs = savedThis = null; } }, ms); } return wrapper; }