MST
星途 面试题库

面试题:TypeScript 联合类型与交叉类型在泛型及条件类型中的深度应用

编写一个泛型函数 `combineData`,它接受两个参数,这两个参数的类型可以是任意类型的联合类型。函数要返回一个新的类型,这个类型是两个参数类型的交叉类型。并且在函数内部,根据传入参数的联合类型情况,使用条件类型来处理不同类型组合的逻辑。例如,如果其中一个参数是 `string` 类型的联合,另一个是 `number` 类型的联合,要对字符串和数字进行特定的处理并返回结果。请完整实现该泛型函数及其相关类型定义。
19.5万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
// 定义泛型函数
function combineData<T, U>(arg1: T, arg2: U): T & U {
    // 这里简单使用类型断言,因为TS在运行时无法区分联合类型中的具体类型
    return Object.assign({}, arg1, arg2) as T & U;
}

// 示例使用
let result1 = combineData({ name: 'John' }, { age: 30 });
console.log(result1);

解释:

  1. 定义了泛型函数 combineData,它接受两个泛型参数 TU
  2. 使用 Object.assign 方法将两个对象合并,并通过类型断言返回 T & U 类型的结果。
  3. 示例中展示了如何调用该函数,将一个包含 name 属性的对象和一个包含 age 属性的对象合并成一个新对象。

如果需要根据不同联合类型做更具体处理,示例如下:

// 定义泛型函数
function combineData<T, U>(arg1: T, arg2: U): T & U {
    if (typeof arg1 ==='string' && typeof arg2 === 'number') {
        // 这里是对string和number类型的特定处理
        return (`${arg1} - ${arg2}` as unknown) as T & U;
    }
    if (typeof arg1 === 'number' && typeof arg2 ==='string') {
        // 这里是对number和string类型的特定处理
        return (`${arg2} - ${arg1}` as unknown) as T & U;
    }
    // 其他情况简单合并
    return Object.assign({}, arg1, arg2) as T & U;
}

// 示例使用
let result1 = combineData('test', 123);
console.log(result1);
let result2 = combineData({ name: 'John' }, { age: 30 });
console.log(result2);

解释:

  1. 在函数内部,增加了对 arg1stringarg2number 以及 arg1numberarg2string 这两种情况的特定处理。
  2. 对于其他类型组合,依然使用 Object.assign 进行简单合并。
  3. 示例展示了不同类型组合的调用及处理结果。