解决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
相关产品推荐
相关产品推荐

