typescript TS2556:spread参数必须具有元组类型或传递给rest参数,在Object.assign中使用

2hh7jdfx  于 2023-05-08  发布在  TypeScript
关注(0)|答案(2)|浏览(472)

所以我有这个函数:

export default function getObjectFromTwoArrays(keyArr: Array<any>, valueArr: Array<any>) {
  // StartPoint:
  //  [key1,key2,key3],
  //  [value1,value2,value3]
  //
  // EndPoint: {
  //  key1: value1,
  //  key2: value2,
  //  key3: value3
  // }

  if (keyArr.length === valueArr.length) {
    // @ts-ignore
    return Object.assign(...keyArr.map((el,index) => ({[el]: valueArr[index]})))
  } else {
    throw new Error(`Arrays should be the same length: ${{keyArr}}, ${{valueArr}}`)
  }
}

所以我需要从上面的例子中得到确切的结果-端点。我试着扩展到一个变量,得到了同样的问题。
我试图替换为:Object.assign({...keyArr.map((el,index) => ({[el]: valueArr[index]}))})
但结果会是:{0: {key1: value1}, 1: {key2: value2}}
关于Object.assign([...keyArr.map((el,index) => ({[el]: valueArr[index]}))])
结果:[{key1: value1}, {key2: value2}]

bxjv4tth

bxjv4tth1#

Object.assign method至少接受一个参数,但在您的函数中,您正在扩展的数组可能是空的。错误消息中的关键部分是“must be passed to a rest parameter”,从各种重载签名中,您希望使用的是assign(target: object, ...sources: any[]): any;。为了避免使用// @ts-ignore,您可以编写

return Object.assign({}, ...keyArr.map((el,index) => ({[el]: valueArr[index]})))
//                   ^^^

(Playground演示)
但是,您真的不应该为此使用Object.assign。你想要的是Object.fromEntries,它接受一个可迭代的元组:

export default function getObjectFromTwoArrays(keyArr: Array<any>, valueArr: Array<any>) {
  if (keyArr.length === valueArr.length) {
    return Object.fromEntries(keyArr.map((key, index) => [key, valueArr[index]]))
  } else {
    throw new Error(`Arrays should be the same length: ${{keyArr}}, ${{valueArr}}`)
  }
}
yv5phkfx

yv5phkfx2#

根据参数的名称,看起来像是试图将一个键数组和一个值数组转换为一个对象。但是Object.assign需要 * 两个 * 参数:a source and a target。两者都不应该是数组。你想要Object.fromEntries,但首先你需要将这两个数组组合成一个键/值对数组:

const zip = (xs, ys) => {
  if (xs.length === ys.length) {
    return xs.map((x, i) => [x, ys[i]]);
  } else {
    throw new Error('cannot merge arrays of unequal length');
  }
};

const getObjectFromTwoArrays = (keys, values) => Object.fromEntries(zip(keys, values));

Object.fromEntries方法接受一个键/值对数组并将其转换为对象,它与Object.entries匡威。参见:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries

相关问题