如何在TypeScript中获取枚举的大小并将其作为类型使用?
获取TypeScript枚举的长度作为类型
好问题!在TypeScript里,没法像数组/元组那样直接用T["length"]拿到枚举的长度类型——毕竟枚举在类型系统里的本质是对象类型,和数组的结构完全不同。不过我们可以通过几个类型工具的组合来实现这个需求,下面一步步来拆解:
核心思路
要获取枚举的长度类型,我们需要:
- 先把枚举的成员键(或值)转换成联合类型
- 再把联合类型转换成元组类型(因为元组的
length是字面量数字类型,正是我们需要的) - 最后取元组的
length属性作为结果
具体实现
1. 字符串枚举的情况
针对你给出的字符串枚举示例,我们可以这样写:
enum Example { how = "how", to = "to", count = "count", enum = "enum", entries = "entries" } // 工具类型:把联合类型转换成元组 type UnionToTuple<T> = T extends never ? [] : (T extends infer U ? [U, ...UnionToTuple<Exclude<T, U>>] : []); // 工具类型:获取枚举的长度类型 type EnumLength<E extends Record<string, any>> = UnionToTuple<keyof E>["length"]; // 测试:类型为5,和枚举成员数量一致 type ExampleLength = EnumLength<typeof Example>;
2. 数字枚举的注意点
如果是数字枚举,TypeScript会自动生成反向映射(比如NumericExample[0] = "how"),这时候keyof typeof E会同时包含字符串键和数字键,直接用上面的方法会得到翻倍的长度。我们需要先过滤掉数字键:
enum NumericExample { how, to, count } // 工具类型:过滤枚举中的数字键 type EnumKeys<E> = Exclude<keyof E, `${number}`>; // 获取数字枚举的长度类型 type NumericEnumLength = UnionToTuple<EnumKeys<typeof NumericExample>>["length"]; // 类型为3,正确
原理说明
keyof typeof Example会提取出枚举所有成员的键的联合类型,比如字符串枚举里就是"how" | "to" | "count" | "enum" | "entries"UnionToTuple通过递归和Exclude工具类型,把联合类型拆解成顺序的元组(顺序不影响长度计算)- 最后元组的
length属性是字面量数字类型,也就是我们要的枚举成员数量类型
内容的提问来源于stack exchange,提问作者Buszmen
相关产品推荐
相关产品推荐

