关于扩展运算符数组使用及Object.values报错的类型与修复咨询
解答你的TypeScript问题
先来说说你碰到的两个问题,我帮你一步步拆解清楚:
问题2:Object.values(x)报错的修复与x的类型定义
你当前代码里的报错,核心原因是x的类型是TypeScript自动推断的,但没明确关联到你定义的DD接口,导致Object.values(x)的返回类型在类型检查时出现歧义,进而引发报错。
正确的类型定义方式
你需要给x指定明确的类型,让TypeScript清楚它的两个属性都是DD类型的数组,这里有两种简洁的实现方式:
- 自定义专属类型接口
interface DD { y:string, u:string } // 定义包含man和woman属性的集合类型 interface PersonGroups { man: DD[]; woman: DD[]; } // 给x指定该类型 const x: PersonGroups = { man:[{ y:'y', u:'u' }], woman:[{ y:'y', u:'u' }] };
- 使用Record工具类型(更精简)
interface DD { y:string, u:string } // Record<键名集合, 键值类型>,这里键名是'man'/'woman',键值是DD数组 const x: Record<'man' | 'woman', DD[]> = { man:[{ y:'y', u:'u' }], woman:[{ y:'y', u:'u' }] };
修复后的完整代码
修改后Object.values(x)会被正确推断为DD[][](数组的数组),扩展运算符传递给concat就不会有类型问题了,完整代码如下:
interface DD { y:string, u:string } const x: Record<'man' | 'woman', DD[]> = { man:[{ y:'y', u:'u' }], woman:[{ y:'y', u:'u' }] }; function mergePersonGroups() { return [].concat(...Object.values(x)); } console.log(mergePersonGroups()) // 输出结果:[{ y: 'y', u: 'u' }, { y: 'y', u: 'u' }]
问题1:扩展运算符处理数组的疑问
其实你的代码里扩展运算符的用法本身是完全没问题的——[].concat(...arrays)就是把多个数组合并为一个的标准写法。之前的报错并不是扩展运算符的问题,而是因为x的类型不明确,导致Object.values(x)的类型不符合concat的参数要求。只要解决了x的类型定义问题,扩展运算符就能正常工作啦。
内容的提问来源于stack exchange,提问作者user10336550
相关产品推荐
相关产品推荐

