/* eslint-disable @typescript-eslint/no-explicit-any */ // 深拷贝 export function deepMerge(...objs: any[]): any { const result = Object.create(null) objs.forEach((obj) => { if (obj) { Object.keys(obj).forEach((key) => { const val = obj[key] if (isPlainObject(val)) { // 递归 if (isPlainObject(result[key])) { result[key] = deepMerge(result[key], val) } else { result[key] = deepMerge(val) } } else { result[key] = val } }) } }) return result } export const isPlainObject = (val: any) => !!val && typeof val === 'object' && val.constructor === Object //防抖 // fn 要执行的函数 // delay 执行函数 export const debounce = ReturnType>( callback: T, timeout: number ): ((...args: Parameters) => void) => { let timer: ReturnType return (...args: Parameters) => { clearTimeout(timer) timer = setTimeout(() => { callback(...args) }, timeout) } } //封装节流 // fn 要执行的函数 // delay 执行函数 export const throttle = ReturnType>( callback: T, timeout: number ): ((...args: Parameters) => void) => { let valid = true let timer: ReturnType return (...args: Parameters) => { if (!valid) { return false } valid = false clearTimeout(timer) timer = setTimeout(() => { callback(...args) valid = true }, timeout) } } export const exportBlob =(res:any)=>{ const blob = new Blob([res]); //res为后台返回的文件流,注意参数是以数组的形式上传 const href = URL.createObjectURL(blob); //URL都要大写,这点也要注意 const link = document.createElement("a") //生成a标签用于模拟下载 link.download = "test.xlsx"; //自定义下载文件名称 link.href = href //把生成的href赋值到a标签上,在这里我遇到一个问题, //直接赋值无法把href赋值到a标签的href上(不知道是不是因为封装框架的问题) //我采用了原生的方法 //link.setAttribute("href", href); document.body.appendChild(link); link.click(); //释放空间 document.body.removeChild("link"); URL.removeObjectURL(href); }