import { Merge } from 'type-fest'; import { set } from './set'; type ArgType = Record; type _Merge = T extends Merge ? T : Merge; export function merge(input: Readonly): T; export function merge( input: Readonly, arg: Readonly, ): _Merge; export function merge( input: Readonly, args1: Readonly, args2: Readonly, ): _Merge<_Merge, V>; export function merge< T, U extends ArgType, V extends ArgType, W extends ArgType >( input: Readonly, args1: Readonly, args2: Readonly, args3: Readonly, ): _Merge<_Merge<_Merge, V>, W>; export function merge(input: any, ...args: any[]): any; export function merge(input: any, ...args: any[]) { const changes: any = {}; args.forEach((obj) => { for (const key in obj) { changes[key] = obj[key]; } }); let result: any = input; for (const key in changes) { result = set(result, key, changes[key]); } return result; }