如何从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代码,可以按照以下逻辑:
- 根据JSON生成对应的原始TypeScript类型(可以用
typeof或者自动化工具) - 将生成的原始类型传入
RecursiveOpen工具类型,得到最终的开放类型 - 导出原始的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
相关产品推荐
相关产品推荐

