TypeScript按键分组对象:如何合并同键对象的值?
解决方案:合并单键对象数组并处理TypeScript类型
完整实现代码
先定义精准的类型约束,再通过reduce完成合并,同时解决类型检查报错问题:
// 定义原数组元素类型:单键对象,键为`key-数字`格式,值为目标对象 type OriginalItem = { [K in `key-${number}`]: Record<string, unknown> }; // 定义合并后结果类型:键对应原数组的键,值为对应对象的数组 type MergedResult = { [K in `key-${number}`]?: Record<string, unknown>[] }; const original: OriginalItem[] = [ { "key-8": { "some": "object" } }, { "key-12": { "some": "object" } }, { "key-12": { "some": "object" } }, { "key-1": { "some": "object" } }, { "key-8": { "some": "object" } } ]; const merged = original.reduce<MergedResult>((acc, item) => { // 获取当前对象的唯一键,并断言为我们定义的类型 const key = Object.keys(item)[0] as `key-${number}`; const value = item[key]; // 合并逻辑:键已存在则追加元素,不存在则初始化数组 acc[key] ? acc[key].push(value) : (acc[key] = [value]); return acc; }, {});
类型问题说明与优化
你之前遇到TypeScript报错的核心原因:
Object.keys()默认返回string[],TypeScript无法自动推断出它是key-数字这类特定格式的键- 未给累加器
acc指定明确类型,导致类型推断模糊
如果你的"some object"有具体结构,可替换为更严格的类型:
// 假设目标对象的明确结构 type TargetObject = { some: string; extraProp?: boolean }; type OriginalItem = { [K in `key-${number}`]: TargetObject }; type MergedResult = { [K in `key-${number}`]?: TargetObject[] };
如果不需要限制键的格式(支持任意键名),可使用通用类型:
type OriginalItem = Record<string, TargetObject>; type MergedResult = Record<string, TargetObject[]>; // 此时键的断言改为string即可 const key = Object.keys(item)[0] as string;
内容的提问来源于stack exchange,提问作者kolomichenko
相关产品推荐
相关产品推荐

