如何递归转换TypeScript接口/类属性类型?适配GraphQL数据解析优化
实现TypeScript类型转换:将属性转为boolean/递归处理数组元素
可以通过TypeScript的条件类型和递归类型实现你需要的TransformToQueried类型,满足以下规则:
- 原始类型(字符串、数字、字面量类型等)转为
boolean - 数组类型转为其元素类型的递归转换结果
- 对象/接口类型递归处理每个属性
完整类型定义
type TransformToQueried<T> = // 处理数组类型:提取元素类型并递归转换 T extends Array<infer U> ? TransformToQueried<U> : // 处理对象/接口类型:遍历所有属性递归转换 T extends object ? { [K in keyof T]: TransformToQueried<T[K]> } : // 原始类型直接转为boolean boolean;
验证示例
用你提供的User和Skill接口测试:
interface Skill { name: string; level: 'beginner' | 'intermediate' | 'advanced'; } interface User { id: number; email: string; skills: Skill[]; } // 生成目标类型 type QueriedUser = TransformToQueried<User>; type QueriedSkill = TransformToQueried<Skill>;
此时QueriedUser的结构完全符合预期:
// 等价于: interface QueriedUser { id: boolean; email: boolean; skills: QueriedSkill; // 对应Skill[]转换为TransformToQueried<Skill> } interface QueriedSkill { name: boolean; level: boolean; }
扩展说明
这个类型支持更深层次的嵌套结构,比如如果Skill里还有数组属性,也会被正确处理:
interface Skill { name: string; level: 'beginner' | 'intermediate' | 'advanced'; tags: string[]; } type QueriedSkill = TransformToQueried<Skill>; // 结果: // { // name: boolean; // level: boolean; // tags: boolean; // string[] → TransformToQueried<string> → boolean // }
内容的提问来源于stack exchange,提问作者Juraj Zovinec
相关产品推荐
相关产品推荐

