MST

星途 面试题库

面试题:TypeScript接口扩展与合并在泛型编程中的应用

实现一个泛型函数`mergeInterfaces`,它接收两个接口类型参数`T`和`U`,返回一个新的接口类型,这个新接口类型是`T`和`U`合并后的结果(类似接口合并的效果)。并且需要考虑到同名属性类型冲突时,如何通过类型约束和条件类型来优雅地处理这种情况,例如如果同名属性类型不同,抛出一个类型错误提示开发者处理冲突。请完整实现这个泛型函数及相关类型定义。
48.6万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
type MergeInterfaces<T, U> = {
    [K in keyof T | keyof U]: K extends keyof T
      ? K extends keyof U
          ? T[K] extends U[K]
              ? T[K]
               : U[K] extends T[K]
                  ? U[K]
                   : never // 类型冲突,抛出类型错误
          : T[K]
      : K extends keyof U
          ? U[K]
          : never;
};

function mergeInterfaces<T, U>(obj1: T, obj2: U): MergeInterfaces<T, U> {
    const result = {} as MergeInterfaces<T, U>;
    for (const key in obj1) {
        result[key as keyof MergeInterfaces<T, U>] = obj1[key as keyof T];
    }
    for (const key in obj2) {
        if (!Object.prototype.hasOwnProperty.call(obj1, key)) {
            result[key as keyof MergeInterfaces<T, U>] = obj2[key as keyof U];
        }
    }
    return result;
}