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

如何为深层对象的最终数值创建TypeScript联合类型?

从嵌套const对象中提取所有数字ID的联合类型

你可以通过递归类型工具实现需求,无需修改原Messages对象结构,就能自动提取所有嵌套的数字ID字面量,生成精确的联合类型。

实现代码

首先定义递归提取类型,再结合typeof Messages生成目标类型:

// 递归提取所有嵌套的数字ID类型
type ExtractIds<T> = 
  // 如果是数字类型,直接返回
  T extends number ? T :
  // 如果是只读数组(as const 修饰的数组为只读),提取数组元素的类型再递归处理
  T extends readonly any[] ? ExtractIds<T[number]> :
  // 如果是对象,提取所有属性值的类型再递归处理
  T extends object ? ExtractIds<T[keyof T]> :
  // 非目标类型返回never,不会出现在联合类型中
  never;

// 生成Messages中所有ID的联合类型
type MessageIds = ExtractIds<typeof Messages>;
// 此时MessageIds等价于:1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

验证使用

将translate函数的参数类型改为MessageIds,即可实现类型安全校验:

function translate(id: MessageIds): string {
  // 你的业务逻辑实现
  return '';
}

const validLabel = translate(Messages.Beta.A); // ✅ 类型检查通过
const invalidLabel = translate(10); // ❌ 类型报错:10不在有效ID集合中

关键说明

  1. 原对象的as const是核心前提:它会把所有数字转为字面量类型(而非宽泛的number),确保能提取精确的联合类型;
  2. 递归类型自动适配任意深度的嵌套结构,包括对象、数组的混合嵌套,完全适配你2300行的大对象场景;
  3. 类型会自动过滤非数字类型的内容,符合你"ID始终是正整数"的约束。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 21:32:01