* 对象合并
* @author JunBin.Yang
*/
* 深度合并多个对象(递归合并)
* @param target - 目标对象,合并结果将存入该对象
* @param sources - 源对象数组,将按顺序合并到目标对象
* @returns 合并后的目标对象
*/
export function ObjectAssign<T extends object, U extends Array<object | null | undefined>>(target: T, ...sources: U): T & Partial<NonNullable<U[number]>> {
if (target === null || target === undefined) {
throw new TypeError('Cannot convert undefined or null to object');
}
if (!sources || sources.length === 0) {
return target
}
const deepAssign = (obj1: any, obj2: any): any => {
if (obj2 === null || obj2 === undefined) {
return obj1
}
for (const key in obj2) {
if (Object.prototype.hasOwnProperty.call(obj2, key)) {
const obj1Val = obj1[key]
const obj2Val = obj2[key]
if (
obj1Val &&
obj2Val &&
typeof obj1Val === 'object' &&
typeof obj2Val === 'object' &&
!Array.isArray(obj1Val) &&
!Array.isArray(obj2Val)
) {
obj1[key] = deepAssign(obj1Val, obj2Val)
} else {
obj1[key] = obj2Val
}
}
}
return obj1
}
sources.forEach(source => {
if (source !== null && source !== undefined) {
target = deepAssign(target, source) as T & U[number]
}
})
return target
}