寻求可将复杂TypeScript类型拆解为基础原始类型的工具
TypeScript复杂类型扁平化工具推荐
以下是几种能把嵌套、泛型、继承的复杂TS类型拆解为扁平化原始类型的方案,适配你的文档需求:
IDE原生查看功能
VS Code、WebStorm这类主流TS IDE都自带类型展开能力。把鼠标悬停在目标类型(比如Woop<T>)上,IDE会自动解析并展示完全展开后的类型结构——包含所有继承自Base、Something<T>的属性,以及泛型实例化后的具体字段。直接复制这个展开结果就能用在文档里。第三方工具库的预定义类型
很多TS工具库提供了现成的扁平化工具类型,无需自己造轮子:ts-toolbelt:通过$Obj.Merge或Expand类型可递归展开嵌套、继承的类型,支持泛型解析。type-fest:提供ExpandDeep类型,能深度展开所有嵌套对象、联合类型和泛型实例。
用法示例:
import { ExpandDeep } from 'type-fest'; // 展开Woop<MyType>为扁平化类型 type FlatWoop = ExpandDeep<Woop<MyType>>;定义完成后,在IDE中查看
FlatWoop即可得到完全扁平化的原始类型结构。手动实现展开类型
如果不想引入第三方依赖,可自行编写递归展开的工具类型:// 浅展开:仅展开顶层类型 type Expand<T> = T extends infer O ? { [K in keyof O]: O[K] } : never; // 深度展开:递归展开所有嵌套层级 type ExpandDeep<T> = T extends object ? T extends infer O ? { [K in keyof O]: ExpandDeep<O[K]> } : never : T;将你的复杂类型传入
ExpandDeep,比如type FlatA = ExpandDeep<A>,就能得到完全扁平化的结果。利用TS编译器输出展开类型
可以借助tsc的错误提示获取展开后的类型:在代码中故意编写类型不匹配的代码,比如:// 故意触发类型错误,让编译器输出展开后的类型 const temp: never = {} as Woop<MyType>;运行
tsc --noEmit后,编译器会在错误信息里输出Woop<MyType>展开后的完整类型结构,直接提取即可。
内容的提问来源于stack exchange,提问作者JHH
相关产品推荐
相关产品推荐

