export function debounce void>( fn: T, delay: number = 300, ): (...args: Parameters) => void { let timeoutId: ReturnType | null = null; return function (this: ThisParameterType, ...args: Parameters) { if (timeoutId) clearTimeout(timeoutId); timeoutId = setTimeout(() => { fn.apply(this, args); }, delay); }; }