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

TypeScript中为任意深度嵌套数组对象添加属性的递归函数类型定义问题

核心问题说明

原有代码的类型定义存在两处错误:

  1. 返回类型不符合实际逻辑:输入为嵌套数组时,输出会保持相同的嵌套层级,而非直接返回泛型T
  2. 未体现新增属性:返回的所有对象都新增了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:57:00