~/about/gist/debounce-ts.md
about/gist/debounce-ts

A tiny typed debounce

Jul 12, 2026#typescript#utils

I reach for this constantly — a debounce that preserves the wrapped function’s parameter types:

export function debounce<A extends unknown[]>(
  fn: (...args: A) => void,
  ms = 300,
) {
  let timer: ReturnType<typeof setTimeout>;
  return (...args: A) => {
    clearTimeout(timer);
    timer = setTimeout(() => fn(...args), ms);
  };
}

Usage:

const onSearch = debounce((q: string) => fetchResults(q), 250);