如何在TypeScript中递归将原始类型替换为自定义参数化类型
这个转换完全可以实现,用TypeScript的递归条件类型就能轻松搞定。
实现逻辑梳理
你给出的转换规则可以拆解为3个通用逻辑:
- 基础类型字段(如string、number):替换为包含
onChange方法的对象,onChange的入参类型和原字段类型一致 - 对象类型字段:递归遍历对象内部的所有属性,每个属性都按上述规则转换
- 数组类型字段:保留数组结构,仅对数组的元素类型做规则转换
具体实现代码
可以直接封装一个通用的递归工具类型:
type Transform<T> = // 匹配数组类型,处理元素类型后保留数组结构 T extends Array<infer Item> ? Array<Transform<Item>> // 匹配对象类型,递归处理每一个属性 : T extends object ? { [K in keyof T]: Transform<T[K]> } // 匹配基础类型,转换为带onChange的结构 : { onChange: (v: T) => void }
用法
直接用该工具类型包裹你原有接口即可:
type transformed = Transform<example>
生成的类型和你需要的目标结构完全匹配。
注:你示例中u字段原类型是string,转换后onChange入参写为number,看起来是笔误。如果确实存在基础类型的映射需求,只需要在基础类型分支添加对应的条件判断即可。
内容的提问来源于stack exchange,提问作者exrhizo
相关产品推荐
相关产品推荐

