You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决TS2556错误:Object.assign展开参数的类型问题

解决TS2556错误并实现双数组转键值对对象

问题原因

你遇到的TS2556错误是因为TypeScript无法推断keyArr.map()返回数组的具体长度和元素类型——普通Array<any>类型不符合Object.assign()对扩展参数的类型要求(要求是元组类型或传给剩余参数),因此抛出类型错误。

正确实现方式

方式1:使用reduce(推荐,类型友好)

reduce是实现这类转换最直观且适配TypeScript类型系统的方式,无需额外类型断言也能正常工作:

export default function getObjectFromTwoArrays(keyArr: Array<any>, valueArr: Array<any>) {
  if (keyArr.length !== valueArr.length) {
    throw new Error(`Arrays should be the same length: ${keyArr}, ${valueArr}`);
  }

  return keyArr.reduce((result, key, index) => {
    result[key] = valueArr[index];
    return result;
  }, {} as Record<any, any>);
}

如果需要更严谨的类型约束,可以用泛型优化:

export default function getObjectFromTwoArrays<K extends PropertyKey, V>(keyArr: K[], valueArr: V[]) {
  if (keyArr.length !== valueArr.length) {
    throw new Error(`Arrays should be the same length: ${keyArr}, ${valueArr}`);
  }

  return keyArr.reduce((result, key, index) => {
    result[key] = valueArr[index];
    return result;
  }, {} as Record<K, V>);
}

方式2:修复原Object.assign写法

通过类型断言告诉TypeScript,map返回的数组元素都是合法对象,即可消除类型错误:

export default function getObjectFromTwoArrays(keyArr: Array<any>, valueArr: Array<any>) {
  if (keyArr.length === valueArr.length) {
    const objEntries = keyArr.map((el, index) => ({[el]: valueArr[index]})) as Array<Record<any, any>>;
    return Object.assign({}, ...objEntries);
  } else {
    throw new Error(`Arrays should be the same length: ${keyArr}, ${valueArr}`);
  }
}

错误写法分析

  • 你尝试的Object.assign({...keyArr.map(...)}):本质是把map返回的数组展开成对象的键值对,数组的索引会变成对象的键(如0、1),因此得到索引对应子对象的结构。
  • Object.assign([...keyArr.map(...)]):因为第一个参数是数组,Object.assign会把数组作为目标对象,最终返回的还是数组结构,而非预期的键值对对象。

内容的提问来源于stack exchange,提问作者Victor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 21:17:28