export type DeepDel = T extends | Function | number | null | string | symbol | undefined ? T : T extends (infer A)[] ? A extends object ? DeepDel[] : A extends Function | number | null | string | symbol | undefined ? A[] : [DeepDel] : Pick< { [k in keyof T]: T[k] extends object ? DeepDel : T[k] }, Exclude > /** * deep delete key from obj * @param obj any obj * @param keys keys to delete * @default ["_uid"] * @returns obj without key */ export function deepDel( obj: T, ...keys: K ): DeepDel { if (typeof obj === "object") { if (Array.isArray(obj)) { obj.forEach((d) => deepDel(d, ...keys)) } else if (obj !== null) { keys.forEach((k) => { delete (obj as any)[k] }) for (const k in obj) { deepDel(obj[k], ...keys) } } } return obj as any }