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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 21:27:38