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

2022-08-29 23:32:56

我收到一个数字,必须检查它是否存在于此枚举中: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 ...
}

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


答案 1

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

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

成为:

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

所以你只需要做:

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

如果收到以下错误:,则您的目标不是 ES2017。您可以使用以下 tsconfig.json 配置:Property 'values' does not exist on type 'ObjectConstructor'

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

或者你可以做任何演员:

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

答案 2

这仅适用于非 const、基于数字的枚举。有关 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
}