MST

星途 面试题库

面试题:TypeScript基本类型在复杂场景下的类型推断与类型编程

假设你有一个函数`combineData`,它接受两个参数,这两个参数可以是数组或者对象。如果两个参数都是数组,将它们合并成一个新数组;如果两个参数都是对象,将它们的属性合并成一个新对象;如果一个是数组一个是对象,返回`null`。请使用TypeScript进行类型定义和实现,并且要处理好各种复杂的类型推断情况,例如对象属性类型的合并等。
37.5万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
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;
    }
}