rx-player
Version:
Canal+ HTML5 Video Player
53 lines (48 loc) • 1.31 kB
text/typescript
import objectAssign from "./object_assign";
/**
* Check if an item is an object
* @param item
* @returns {boolean}
*/
function isObject(item: unknown): boolean {
return (
item !== null &&
item !== undefined &&
!Array.isArray(item) &&
typeof item === "object"
);
}
type IDeepPartial<T> = {
[P in keyof T]?: IDeepPartial<T[P]>;
};
type ISourcesArgument = unknown[];
/**
* Deeply merge nested objects
* @param target
* @param sources
* @returns output : merged object
*/
export default function deepMerge<T extends Record<string | number | symbol, unknown>>(
target: T,
...sources: ISourcesArgument
): T {
if (sources.length === 0) {
return target;
}
const source = sources.shift() as IDeepPartial<T>;
if (isObject(target) && isObject(source)) {
for (const key in source) {
if (isObject(source[key])) {
let newTarget = target[key] as Record<string | number | symbol, unknown>;
if (newTarget === undefined) {
newTarget = {};
(target[key] as Record<string | number | symbol, unknown>) = newTarget;
}
deepMerge(newTarget, source[key] as IDeepPartial<typeof newTarget>);
} else {
objectAssign(target, { [key]: source[key] });
}
}
}
return deepMerge(target, ...sources);
}