A tiny typed debounce
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);