检查 TypeScript 的枚举中是否存在值

新手上路,请多包涵

我收到一个数字 type = 3 并且必须检查它是否存在于这个枚举中:

export const MESSAGE_TYPE = {
    INFO: 1,
    SUCCESS: 2,
    WARNING: 3,
    ERROR: 4,
};

我发现的最好方法是将所有枚举值作为一个数组并在其上使用 indexOf。但是生成的代码不是很清晰:

if( -1 < _.values( MESSAGE_TYPE ).indexOf( _.toInteger( type ) ) ) {
    // do stuff ...
}

有没有更简单的方法来做到这一点?

原文由 Tim Schoch 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.6k
2 个回答

如果您希望它与字符串枚举一起使用,则需要使用 Object.values(ENUM).includes(ENUM.value) 因为字符串枚举不是反向映射的,根据 https://www.typescriptlang.org/docs/handbook /release-notes/typescript-2-4.html

 enum Vehicle {
 Car = 'car',
 Bike = 'bike',
 Truck = 'truck'
 }

变成:

 {
 Car: 'car',
 Bike: 'bike',
 Truck: 'truck'
 }

所以你只需要这样做:

 if (Object.values(Vehicle).includes('car')) {
 // Do stuff here
 }

如果您收到以下错误: Property 'values' does not exist on type 'ObjectConstructor' ,那么您不是针对 ES2017。您可以使用此 tsconfig.json 配置:

 "compilerOptions": {
 "lib": ["es2017"]
 }

或者你可以做任何演员:

 if ((<any>Object).values(Vehicle).includes('car')) {
 // Do stuff here
 }

原文由 Xiv 发布,翻译遵循 CC BY-SA 4.0 许可协议

这仅适用于非常量、基于数字的枚举。对于 const 枚举或其他类型的枚举,请参阅 此答案


如果您使用的是 TypeScript,则可以使用 实际的枚举。然后您可以使用 in 检查它。

 export enum MESSAGE_TYPE {
    INFO = 1,
    SUCCESS = 2,
    WARNING = 3,
    ERROR = 4,
};

var type = 3;

if (type in MESSAGE_TYPE) {

}

这是有效的,因为当您编译上面的枚举时,它会生成以下对象:

 {
    '1': 'INFO',
    '2': 'SUCCESS',
    '3': 'WARNING',
    '4': 'ERROR',
    INFO: 1,
    SUCCESS: 2,
    WARNING: 3,
    ERROR: 4
}

原文由 Saravana 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题