TS 泛型交叉类型

是这样的,我实现一个函数cross的方法,实现两个对象的属性合并

function cross<T extends object, U extends object>(objOne: T, objTwo: U): T & U {
  let obj = {}
  let combine = obj as T & U
  Object.keys(objOne).forEach((key) => {
    combine[key] = objOne[key]  // 报错
  })
  Object.keys(objTwo).forEach((key) => {
    if (!combine.hasOwnProperty(key)) {
      combine[key] = objTwo[key] //报错
    }
  })
  return combine;
}

有大神帮帮我看看么

阅读 1.7k
2 个回答

因为你的keystring类型,而不是keyof T。你约束了combine的类型必须是T & U,但string可以是任意不存在于TU的键的值。

正确的写法如下,适用于任意个对象合并:

type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
type TupleTypes<T> = { [P in keyof T]: T[P] } extends { [key: number]: infer V } ? V : never;

function merge<T extends {}[]>(...targets: T): UnionToIntersection<TupleTypes<T>> {
  return Object.assign({}, ...targets);
}
function cross<T extends object, U extends object>(objOne: T, objTwo: U): T & U {
  return {
    ...objTwo,
    ...objOne
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题