function combineData<T, U>(arg1: T, arg2: U): T extends object[] ? U extends object[] ? (T[number] | U[number])[] : null : T extends object ? U extends object ? { [K in keyof T | keyof U]: K extends keyof T ? T[K] : K extends keyof U ? U[K] : never } : null : null {
if (Array.isArray(arg1) && Array.isArray(arg2)) {
return [...arg1, ...arg2] as (T[number] | U[number])[];
} else if (typeof arg1 === 'object' && !Array.isArray(arg1) && typeof arg2 === 'object' && !Array.isArray(arg2)) {
const result: { [K in keyof T | keyof U]: K extends keyof T ? T[K] : K extends keyof U ? U[K] : never } = {} as { [K in keyof T | keyof U]: K extends keyof T ? T[K] : K extends keyof U ? U[K] : never };
for (const key in arg1) {
if (Object.prototype.hasOwnProperty.call(arg1, key)) {
result[key] = arg1[key];
}
}
for (const key in arg2) {
if (Object.prototype.hasOwnProperty.call(arg2, key)) {
result[key] = arg2[key];
}
}
return result;
} else {
return null;
}
}