function debounce<T extends (...args: Parameters<T>) => ReturnType<T>>(
fn: T,
delay: number
): (...args: Parameters<T>) => void {
let timer: ReturnType<typeof setTimeout>;
return (...args: Parameters<T>) => {
clearTimeout(timer);
timer = setTimeout(() => fn(...args), delay);
};
}
// Usage
const search = debounce((query: string, page: number) => {
console.log(`Searching: ${query}, page ${page}`);
}, 300);
search("typescript", 1);
search("typescript generics", 1); // only this call fires after 300ms
debounce откладывает выполнение функции до тех пор, пока между вызовами не пройдёт delay мс. Дженерик T сохраняет полную типизацию оригинальной функции — аргументы и возвращаемое значение.