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

如何用TypeScript泛型检查对象是否包含指定值?

关于TypeScript枚举值检查的问题解答

不行,你没办法仅通过枚举的类型而非枚举对象本身来做运行时的值检查,核心原因是TypeScript的类型信息在编译阶段会被完全擦除——运行时程序根本不知道你定义的E类型是什么,自然没法用它来做值的校验。

你尝试的代码之所以无法运行,就是因为E只是编译时的类型标记,不是运行时存在的实际对象,Object.values(E)这种写法在运行时会报错,因为E不存在。

正确的实现方式

唯一可行的方案是把枚举对象作为参数传入函数,虽然你觉得繁琐,但这是TypeScript运行时类型检查的必要前提。下面是完整的类型守卫实现:

function isEnumValue<E extends Record<string, string | number>>(
  value: unknown,
  enumObj: E
): value is E[keyof E] {
  return Object.values(enumObj).includes(value as E[keyof E]);
}

使用示例

先定义一个枚举:

enum UserRole {
  Admin = "ADMIN",
  Editor = "EDITOR",
  Viewer = "VIEWER"
}

然后用类型守卫检查数据库返回的值:

const dbReturnedValue = "ADMIN"; // 假设这是数据库返回的字符串

if (isEnumValue(dbReturnedValue, UserRole)) {
  // 这里TypeScript会自动推断dbReturnedValue的类型为UserRole
  console.log("合法的用户角色:", dbReturnedValue);
} else {
  console.log("非法的用户角色");
}

简化使用的小技巧

如果不想每次调用都传枚举对象,可以针对特定枚举封装专用的检查函数:

function isUserRole(value: unknown): value is UserRole {
  return isEnumValue(value, UserRole);
}

// 使用时直接调用即可
if (isUserRole(dbReturnedValue)) {
  // ...
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:32:13