TypeScript中为任意深度嵌套数组对象添加属性的递归函数类型定义问题
核心问题说明
原有代码的类型定义存在两处错误:
- 返回类型不符合实际逻辑:输入为嵌套数组时,输出会保持相同的嵌套层级,而非直接返回泛型
T - 未体现新增属性:返回的所有对象都新增了
marked: true属性,类型定义需要同步扩展
完整解决方案
// 定义任意深度的嵌套结构类型 type Nested<T> = T | Array<Nested<T>>; // 递归类型工具:保持原嵌套结构不变,每层的非数组元素都扩展marked: true属性 type MarkedNested<T> = T extends Array<infer U> ? Array<MarkedNested<U>> // 如果需要覆盖原有marked属性,可替换为:Omit<T, 'marked'> & { marked: true } : T & { marked: true }; function markNested<T>(input: Nested<T>): MarkedNested<T> { if (Array.isArray(input)) { // 此处类型断言是安全的,TS无法自动推导递归map后的类型结构 return input.map(markNested) as MarkedNested<T>; } else { return { ...input, marked: true } as MarkedNested<T>; } }
效果验证
// 测试1:一维对象数组 const test1 = [{ name: '张三' }, { name: '李四' }]; const res1 = markNested(test1); // res1 类型推导结果:{ name: string; marked: true }[] // 测试2:三层嵌套数组 const test2 = [[[{ id: 1 }, { id: 2 }]]]; const res2 = markNested(test2); // res2 类型推导结果:[[[{ id: number; marked: true }]]]
内容的提问来源于stack exchange,提问作者Vincent J
相关产品推荐
相关产品推荐

