Debounce, Throttle에 type 적용하기

Untitled

문제 분석

const throttle = (callback: (...args: unknown[]) => unknown, delay: number) => {
  let timer: NodeJS.Timeout;
  let isWaiting = true;
  return (...args: unknown[]) => {
    if (isWaiting) {
      callback(...args);
      isWaiting = false;
      setTimeout(() => {
        isWaiting = true;
      }, waitingTime);
    }
  };
};

export default throttle;

문제 해결

const throttle = <TArgs extends unknown[]>(
  callback: (...args: TArgs) => unknown,
  waitingTime: number,
) => {
  let isWaiting = true;
  return (...args: TArgs) => {
    if (isWaiting) {
      callback(...args);
      isWaiting = false;
      setTimeout(() => {
        isWaiting = true;
      }, waitingTime);
    }
  };
};

export default throttle;

/ 참고자료

Documentation - Generics

Documentation - Do's and Don'ts

TypeScript Generic Rest Parameters and Tuple Types in Practice