通用防抖hook封装

typescript
12345678910111213141516171819202122
/**
 * 通用防抖函数
 * @param fn 需要防抖执行的函数
 * @param delay 延迟时间(毫秒)
 * @returns 经过防抖处理的新函数
 */
export function debounce<T extends (...args: any[]) => any>(
  fn: T,
  delay: number
): (...args: Parameters<T>) => void {
  let timer: ReturnType<typeof setTimeout> | null = null;

  return function (this: any, ...args: Parameters<T>) {
    if (timer) clearTimeout(timer);

    timer = setTimeout(() => {
      fn.apply(this, args);
      timer = null;
    }, delay);
  };
}