You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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的逻辑:
    1. 先检查当前类型是否包含something属性,提取其内部类型到Inner
    2. 接着确认Inner是对象类型,提取其值的类型到Item
    3. 最后判断Item是否有bar属性,若有则提取bar的类型,否则返回never(never在联合类型中会被自动忽略)

这样就自动过滤掉没有bar属性的结构,只保留有效的bar值类型。

内容的提问来源于stack exchange,提问作者MartinP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 00:30:44