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
相关产品推荐
相关产品推荐

