export function debounce any>( fn: T, delay: number, ): (...args: Parameters) => void { let timer: NodeJS.Timeout | null = null; return function debounced(this: unknown, ...args: Parameters) { if (timer) { clearTimeout(timer); } timer = setTimeout(() => { fn.apply(this, args); }, delay); }; } export function cloneDeep(obj: T): T { if (obj === null || typeof obj !== 'object') { return obj; } if (Array.isArray(obj)) { return obj.map((item) => cloneDeep(item)) as T; } const clone = Object.assign({}, obj); for (const key in clone) { if (Object.prototype.hasOwnProperty.call(clone, key)) { clone[key] = cloneDeep(clone[key]); } } return clone; }