TypeScript索引访问类型优化:避免重复路径访问非均匀生成类型
解决非均匀类型中重复路径提取的问题
针对你遇到的自动生成的非均匀Foo类型,我们可以通过条件类型+映射类型的组合来避免重复书写["bar"]["quux"]路径,同时兼容不包含该结构的属性:
步骤1:定义条件类型提取目标类型
先写一个通用的条件类型,用来判断某个类型是否包含bar.quux结构,并提取quux的类型;如果不包含则返回never(避免误用):
type GetBarQuux<T> = T extends { bar: { quux: infer U } } ? U : never;
这里的infer U是TypeScript的类型推断语法,用来自动提取quux对应的类型。
步骤2:创建映射类型简化访问
基于Foo和上面的条件类型,生成简化后的BQ类型:
type Foo = { foo1: { bar : { quux : string }}, foo2: { bar: { quux: number }}, foo3: number }; type BQ = { [K in keyof Foo]: GetBarQuux<Foo[K]>; };
步骤3:业务代码中使用简化类型
现在你可以直接通过BQ["foo1"]、BQ["foo2"]来访问目标类型,无需重复书写路径:
function aaa(x: BQ["foo1"]) { // x 类型为 string // ... } function bbb(x: BQ["foo2"]) { // x 类型为 number // ... }
对于不包含bar.quux结构的foo3,BQ["foo3"]会被推断为never,如果尝试在函数参数中使用它,TypeScript会直接报错,避免了错误的类型引用。
内容的提问来源于stack exchange,提问作者nponeccop
相关产品推荐
相关产品推荐

