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

TypeScript如何从嵌套对象类型中提取数字键组成联合类型

TypeScript提取嵌套对象数字键为独立类型

完全可以实现,操作步骤如下:

  • 首先给常量添加as const断言
    如果不加该断言,TS会把对象数字键的类型拓宽为通用number,无法提取到精确的字面量值,修改后的常量定义:
    export const messageTypes = {
      ABLEHNUNG_ECON: {
        56: {
          message: "Zählpunkt nicht gefunden",
          event: function () {},
        },
        181: {
          message: "Gemeinschafts-ID nicht vorhanden",
          event: function () {},
        },
      },
      ZUSTIMMUNG_ECON: {
        175: {
          message: "Zustimmung erteilt",
          event: function () {},
        },
      },
      ANTWORT_ECON: {
        99: {
          message: "Meldung erhalten",
          event: function () {},
        },
      },
      ABSCHLUSS_ECON: {
        message: "Abschluss erhalten",
        event: async function (userId: string) {
          await sendNotification(userId, this.message);
        },
      },
    } as const;
    
  • 定义数字键提取工具类型
    借助TS条件类型、模板字面量推断能力,自动提取对象中所有数字格式的键,转换为对应的数字字面量类型:
    type NumericKeys<T> = T extends object ? {
      [K in keyof T]: K extends `${infer N extends number}` ? N : never
    }[keyof T] : never;
    
  • 生成目标联合类型
    遍历常量第一层所有属性的值,批量提取其中的数字键,自动合并为联合类型:
    type ResponseCodesT = NumericKeys<typeof messageTypes[keyof typeof messageTypes]>;
    

最终得到的ResponseCodesT完全匹配预期,等价于type ResponseCodesT = 56 | 181 | 175 | 99。可以通过以下代码校验类型正确性:

// 范围内的值无类型报错
const validCode1: ResponseCodesT = 56;
const validCode2: ResponseCodesT = 181;
const validCode3: ResponseCodesT = 175;
const validCode4: ResponseCodesT = 99;
// 不在范围内的值会触发类型错误
const invalidCode: ResponseCodesT = 100; // 飘红报错

说明

  • 该写法要求TS版本为4.8及以上,低版本TS需要额外实现字符串转数字的工具类型才能完成转换。
  • 不需要手动过滤类似ABSCHLUSS_ECON这类没有数字子键的节点,这类节点的提取结果为never,会在联合类型运算中被自动排除,不会污染最终结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:45:19