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

