检查value是否存在于TypeScript的string enum中



这个问题在TypeScript中检查value是否存在于enum中有几个答案不适用于字符串枚举(或者有些人说他们可以,但其他人不可以)。整理这些答案比应该做的工作要多,所以另一个问题将帮助人们在未来整理这些问题。

假设我有一个查询字符串值,它必须是Vehicle的类型。我有这个enum:

export enum VehicleTypes {
Car = 'car',
Bike = 'bike',
Skateboard = 'skateboard',
}

如何验证字符串是枚举中的一个值?

if (! [...some logic here]) return response.code(400).send(`invalid vehicle type ${vehicle}`);

当字符串枚举被编译时,它不做与数字枚举相同的反向查找工作。这简化了事情,您可以使用Object.values()在字符串枚举中获得有效字符串的列表,并根据该列表测试类型保护。

下面是一个函数示例,它将为指定的string enum创建自定义typeguard函数:

enum myStrEnum {
values = 'are',
all = 'strings',
}
function isValueInStringEnum<E extends string>(strEnum: Record<string, E>) {
const enumValues = Object.values(strEnum) as string[];
return (value: string): value is E => enumValues.includes(value);
}
const isValueInMyStrEnum = isValueInStringEnum(myStrEnum);
console.log(isValueInMyStrEnum('are')); // true
console.log(isValueInMyStrEnum('not')); // false

打印稿操场

as string[]类型断言是必要的,这样TypeScript就不会抱怨使用Array.prototype.includes来检查E[]数组中是否存在string

如果你只需要一个特定enum的类型保护,那么你可以跳过这个例子的外部函数部分,直接创建一个自定义的类型保护函数。

这是我使用的,归功于gqstav。

if (!(Object.values(VehicleTypes) as string[]).includes(vehicle))
return response.code(400).send(`invalid vehicle type ${vehicle}`);

最新更新