TypeScript版本防抖函数

831 阅读1分钟

自己写的一个TS版本的防抖函数
简单自测了一下,应该是可以正常使用的,有没有同学可以不使用any情况下写一版

export const debounce = <T extends (...args: any) => any>(
  fn: T,
  time?: number,
  immediate?: boolean
): ((...args: any) => any) => {
  let timeoutId: null | number
  let defaultImmediate = immediate || false
  let delay = time || 300
  return (...args: any) => {
    if (defaultImmediate) {
      fn.apply(this, args) // 确保引用函数的指向正确,并且函数的参数也不变
      defaultImmediate = false
      return
    }
    if (timeoutId) {
      clearTimeout(timeoutId)
    }
    timeoutId = setTimeout(() => {
      fn.apply(this, args)
      timeoutId = null
    }, delay)
  }
}