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

如何从JSON生成TS代码,实现递归访问对象未定义属性且类型为any

解决方案

要实现递归支持的「允许访问任意未定义属性且类型为any,同时保留原有属性类型」的TypeScript类型,你需要定义一个递归工具类型,对对象的每个嵌套属性都应用「原有类型 + 任意字符串索引为any」的合并逻辑。

1. 定义递归工具类型

首先创建RecursiveOpen工具类型,它会递归处理对象的每个属性:

type RecursiveOpen<T> = T extends object 
  ? T & { [key: string]: RecursiveOpen<any> }
  : T;

这个类型的逻辑是:

  • 如果传入的类型T是对象,就将T和一个「任意字符串索引对应递归开放类型」的接口合并
  • 如果不是对象(比如字符串、数字等基础类型),就直接返回原类型

2. 应用到目标数据上

用这个工具类型处理你的data类型:

const data = {a: "a", b: {c: 'hey'}};

type Data = RecursiveOpen<typeof data>;

const dataOptional: Data = data;

3. 验证效果

现在测试各个场景:

  • ✅ dataOptional.a.nonExistentStringMethod:报错(符合预期,因为a是字符串类型,不存在该方法)
  • ✅ dataOptional.d:不报错(类型为RecursiveOpen<any>,支持任意属性访问)
  • ✅ dataOptional.d.nonExistentStringMethod:不报错(符合预期)
  • ✅ dataOptional.b.d:不报错(b被处理为递归开放类型,允许访问未定义属性d,类型为any)
  • 原有属性的类型依然保留:dataOptional.b.c会被推断为string类型

4. 从JSON生成TypeScript代码(自动化场景)

如果你需要从JSON值自动生成对应的TypeScript代码,可以按照以下逻辑:

  1. 根据JSON生成对应的原始TypeScript类型(可以用typeof或者自动化工具)
  2. 将生成的原始类型传入RecursiveOpen工具类型,得到最终的开放类型
  3. 导出原始的JSON对象,并标注为最终的开放类型

示例自动化生成的代码结构:

// 根据JSON生成的原始类型
type OriginalData = {
  a: string;
  b: {
    c: string;
  };
};

// 应用递归开放类型
type Data = RecursiveOpen<OriginalData>;

// 导出原始JSON对象
export const data: Data = {a: "a", b: {c: 'hey'}};

内容的提问来源于stack exchange,提问作者Tamás

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:55:08