import { useRef, useCallback, useEffect } from 'react'; export default function useDebounce void>( fn: T, delay: number ): (...args: Parameters) => void { const timeoutRef = useRef(null); const debounceFn = useCallback( (...args: Parameters): void => { if (timeoutRef.current) { clearTimeout(timeoutRef.current); } timeoutRef.current = setTimeout(() => { fn(...args); }, delay); }, [fn, delay] ); useEffect(() => { return () => { if (timeoutRef.current) { clearTimeout(timeoutRef.current); } }; }, []); return debounceFn; }