Typescript如何实现递归映射类型将所有字段转为string类型
实现全字段转string的TypeScript递归映射类型
正确工具类型代码
// 定义不需要递归解析的内置/原始类型,可根据业务需求扩展 type PrimitiveOrBuiltIn = string | number | boolean | symbol | bigint | null | undefined | Date | RegExp | Function; type MakeAllFieldsString<T> = // 处理数组场景:递归解析元素类型,返回对应数组类型 T extends Array<infer ItemType> ? MakeAllFieldsString<ItemType>[] // 非数组且属于不需要递归的类型,直接返回string : T extends PrimitiveOrBuiltIn ? string // 普通自定义对象,递归处理每一个属性 : { [Key in keyof T]: MakeAllFieldsString<T[Key]> };
逻辑说明
- 优先判断是否为数组类型,通过
infer提取数组元素类型后递归处理,保证任意层级的数组都能正确转换为string数组 - 过滤不需要递归的内置/原始类型,避免把Date、RegExp等对象的内置属性展开转换
- 对普通自定义对象遍历所有键,递归调用自身处理每个属性值,保证任意层级的嵌套结构都能保持原键结构,值全部替换为string
原写法错误点
- 未处理数组场景,遇到数组类型无法生成
string[]结构 - 错误使用
typeof T[Key],T本身是类型,直接引用T[Key]即可 - 未区分普通对象和内置对象,会错误展开Date等类型的内置属性
- 嵌套处理调用的是仅支持单层的
JsonObject,没有递归调用自身,无法支持多层嵌套
验证示例
用你提供的源类型测试:
type MySourceType = { field1 :string, field2: number, field3: number[], field4: Date, field5: { nestedField1: number, nestedField2: number[], nestedField3: Date, } } // 转换后得到的类型完全符合预期 type MyDestinationType = MakeAllFieldsString<MySourceType>;
转换后的MyDestinationType结构如下,和需求完全匹配:
type MyDestinationType = { field1 :string, field2: string, field3: string[], field4: string, field5: { nestedField1: string, nestedField2: string[], nestedField3: string, } }
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

