TypeScript中如何基于联合类型自动生成对应转换类型?
解决方案
纯 TypeScript 类型系统无法自动生成独立的顶级类型别名,不过有两种成熟的方案可以达到避免手动重复编写的目的。
方案一:使用映射类型(无需额外工具,推荐)
你可以先把所有基础类型收拢到一个结构化的映射表里,后续所有衍生类型都从这个表推导,只需要维护这一个入口:
// 1. 统一维护所有基础类型的映射,新增类型只需要修改此处 type TypeMap = { A: A, B: B, C: C } // 2. MyTypes 直接从映射表推导,不用手动拼接联合类型 type MyTypes = TypeMap[keyof TypeMap] // 3. 批量生成转换后的类型映射 type TransformedMap = { [K in keyof TypeMap as `${K}Trans`]: Transformed<TypeMap[K]> }
使用的时候直接从映射表取值即可:
// 等价于你原本定义的 ATrans type ATrans = TransformedMap['ATrans'] // 等价于你原本定义的 BTrans type BTrans = TransformedMap['BTrans']
如果确实需要单独导出每个类型,也只需要写一次上述的别名声明,后续新增类型时映射表会自动包含新的转换类型,不会遗漏。
方案二:代码生成(需要额外工具链)
如果一定要完全自动生成独立的顶级类型声明,可以写一个简单的 Node 脚本:
- 扫描你的类型定义文件,解析
TypeMap或者MyTypes的成员 - 自动生成对应
XTrans = Transformed<X>的类型声明,写入指定的.d.ts文件 - 把脚本配置到 Git Hooks 或者构建流程中,每次类型改动时自动执行即可
这种方案不需要修改使用侧的代码,但是需要维护额外的工具链逻辑。
内容的提问来源于stack exchange,提问作者Thor Correia
相关产品推荐
相关产品推荐

