// ============================================================ // 共享工具函数 —— 主进程 & 渲染进程通用(纯函数,不依赖平台 API) // ============================================================ /** * 简单防抖函数 * @param fn 目标函数 * @param delay 延迟毫秒数 */ export function debounce void>( fn: T, delay: number, ): (...args: Parameters) => void { let timer: ReturnType | null = null; return (...args: Parameters) => { if (timer !== null) { clearTimeout(timer); } timer = setTimeout(() => { fn(...args); timer = null; }, delay); }; } /** * 节流函数 * @param fn 目标函数 * @param interval 间隔毫秒数 */ export function throttle void>( fn: T, interval: number, ): (...args: Parameters) => void { let lastTime = 0; return (...args: Parameters) => { const now = Date.now(); if (now - lastTime >= interval) { lastTime = now; fn(...args); } }; } /** * 语义化版本号比较 * @returns 1 (v1 > v2), -1 (v1 < v2), 0 (相等) */ export function compareVersions(v1: string, v2: string): number { const parts1 = v1.split('.').map(Number); const parts2 = v2.split('.').map(Number); const maxLen = Math.max(parts1.length, parts2.length); for (let i = 0; i < maxLen; i++) { const a = parts1[i] || 0; const b = parts2[i] || 0; if (a > b) return 1; if (a < b) return -1; } return 0; } /** * 深拷贝(JSON 安全类型) */ export function deepClone(obj: T): T { return JSON.parse(JSON.stringify(obj)); } /** * 生成唯一 ID(简易版,不依赖 crypto) */ export function generateId(): string { return `${Date.now().toString(36)}-${Math.random().toString(36).substring(2, 9)}`; }