如何从TypeScript类型Foo中嵌套的bar属性值创建联合类型?
从嵌套TypeScript类型中提取bar属性值的联合类型
问题
给定如下TypeScript类型:
type Foo = { lorem: { something: { one: { bar: 'a'; }; }; }; ipsum: { something: { two: {}; }; }; dolor: { something: { three: { bar: 'b'; }; }; }; };
需要生成联合类型:
type Result = 'a' | 'b'
如何从上述嵌套结构中提取所有存在的bar属性值,构建该联合类型?
解决方案
可以通过条件类型与索引访问类型组合实现,具体步骤如下:
定义提取工具类型
先写一个工具类型,用来逐层筛选并提取bar的值:
type ExtractBarValues<T> = T extends { something: infer Inner } ? Inner extends Record<string, infer Item> ? Item extends { bar: infer Value } ? Value : never : never : never;
生成目标联合类型
遍历Foo的所有顶层属性,传入工具类型即可得到结果:
type Result = ExtractBarValues<Foo[keyof Foo]>; // 此时 Result 的类型为 'a' | 'b'
原理说明
Foo[keyof Foo]:获取Foo所有顶层属性的类型集合,即三个嵌套对象的联合类型ExtractBarValues的逻辑:- 先检查当前类型是否包含
something属性,提取其内部类型到Inner - 接着确认
Inner是对象类型,提取其值的类型到Item - 最后判断
Item是否有bar属性,若有则提取bar的类型,否则返回never(never在联合类型中会被自动忽略)
- 先检查当前类型是否包含
这样就自动过滤掉没有bar属性的结构,只保留有效的bar值类型。
内容的提问来源于stack exchange,提问作者MartinP
相关产品推荐
相关产品推荐

