TelegramPWA/src/util/deepMerge.ts
2023-01-28 02:21:33 +01:00

35 lines
920 B
TypeScript

import { omit } from './iteratees';
export function deepMerge<T extends any>(value1: T, value2: Partial<T>): T {
const type1 = typeof value1;
const type2 = typeof value2;
if (type1 !== 'object') {
return value2 as T;
}
if (Array.isArray(value2)) {
return value2 as T;
}
if (type1 !== type2) {
return value2 as T;
}
if (value1 === value2) {
return value2 as T;
}
const object1 = value1 as AnyLiteral;
const object2 = value2 as AnyLiteral;
const keys = Object.keys(object2);
// eslint-disable-next-line no-underscore-dangle
const keysDeleted = keys.filter((k) => object2[k]?.__delete);
// eslint-disable-next-line no-underscore-dangle
const keysNotDeleted = keys.filter((k) => !object2[k]?.__delete);
return keysNotDeleted.reduce((acc: any, key) => {
acc[key] = deepMerge(object1[key], object2[key]);
return acc;
}, { ...omit(object1, keysDeleted) });
}