这个问题在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}`);