如何为深层对象的最终数值创建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集合中
关键说明
- 原对象的
as const是核心前提:它会把所有数字转为字面量类型(而非宽泛的number),确保能提取精确的联合类型; - 递归类型自动适配任意深度的嵌套结构,包括对象、数组的混合嵌套,完全适配你2300行的大对象场景;
- 类型会自动过滤非数字类型的内容,符合你"ID始终是正整数"的约束。
内容的提问来源于stack exchange,提问作者Falcowoski
相关产品推荐
相关产品推荐

