代码之家  ›  专栏  ›  技术社区  ›  Normal

使用typescript合并函数

  •  0
  • Normal  · 技术社区  · 2 年前

    我正在尝试用typescript创建一个合并对象函数,

    我创建了以下功能,效果很好:

    const mergeObjects = <T, U>(a: T, b: U): T & U => {
      const mergedObject = {}
      _.merge(mergedObject, a, b)
      return mergedObject as T & U
    }
    
    const a = {
      a: '1',
      b: '2',
    }
    const b = {
      c: '3',
      d: '4',
    }
    const c = mergeObjects(a, b)
    

    如果你悬停在 c ,它将保存属性 a, b, c d

    现在,这个函数只接受两个对象,我想升级这个函数以接收无限数量的参数。

    但我不知道如何创建这样一个函数,

    以下是我迄今为止所做的尝试

    const mergeObjects = <T extends object>(...sources: T[]) => {
      const mergedObject = {}
      _.merge(mergedObject, a, b)
      return mergedObject
    }
    
    const a = {
      a: '1',
      b: '2',
    }
    const b = {
      c: '3',
      d: '4',
    }
    const d = {
      e: '5',
      f: '6',
    }
    const c = mergeObjects(a, b, d)
    

    在我忘记提及之前 _.merge 是一个Lodash方法,你可以阅读它 here

    它基本上是通过改变接收到的第一个参数将两个对象合并在一起。

    我想围绕这个方法做一个包装器,让它返回一个新的对象。

    这就是我们的目标。

    1 回复  |  直到 2 年前
        1
  •  2
  •   cefn    2 年前

    没有 Object.assign() 已经通过打字的方式完成了您需要的内容?

    如果您需要一个新对象,您可以将原始对象的特性展开以创建一个新的 target 的参数 Object.assign

    const merged = Object.assign({...first}, second, third)
    

    Image showing merged type from Object.assign

    如果你想通过显式键入来解决它,这将为你提供一个工作参考。。。

    import { UnionToIntersection } from "utility-types"
    
    function mergeObjects<Arr extends object[]>(...items:Arr) : UnionToIntersection<Arr[number]>{
      const [first, ...rest] = items;
      return Object.assign({...first}, ...rest)
    }
    
    const x = mergeObjects({ a: '' }, { b: '' }, { c: '' }, { d: '' }, { e: '' }, { f: '' }, { g: '' })
    

    See it in typescript playground