import debounce from 'lodash.debounce'; import mem from 'mem'; interface IMemoizeDebouncedFunction any> { (...args: Parameters): void; flush: (...args: Parameters) => void; } // Debounce `func` based on passed parameters // ref: https://github.com/lodash/lodash/issues/2403#issuecomment-816137402 export function memoizeDebounce any>(func: F, wait = 0, options: any = {}): IMemoizeDebouncedFunction { const debounceMemo = mem((..._args: Parameters) => debounce(func, wait, options)); function wrappedFunction(this: IMemoizeDebouncedFunction, ...args: Parameters): ReturnType | undefined { return debounceMemo(...args)(...args); } wrappedFunction.flush = (...args: Parameters): void => { debounceMemo(...args).flush(); }; return wrappedFunction as unknown as IMemoizeDebouncedFunction; }