TypeScript NestJS中字符串枚举字段验证失效问题求助
问题原因及解决方法
核心问题
你当前定义的Timezones是数字枚举,而非字符串枚举。TypeScript中,若枚举成员仅写字面量但不赋值,会自动分配数字序号(0、1、2...)。此时Timezones['Europe/Andorra']的值是0,而非字符串'Europe/Andorra'。@IsEnum(Timezones)默认检查字段值是否在枚举的值集合(即[0,1,2,3])中,自然无法验证字符串类型的时区值。
另外,{ each: true }是用于数组字段的配置(验证数组内每个元素),你的timezone是单个字符串字段,该配置无意义,可直接移除。
解决方案
方案1:修正为字符串枚举
给每个枚举成员显式赋值为对应的时区字符串,让枚举的键和值保持一致:
export enum Timezones { 'Europe/Andorra' = 'Europe/Andorra', 'Asia/Dubai' = 'Asia/Dubai', 'Asia/Kabul' = 'Asia/Kabul', 'America/Antigua' = 'America/Antigua' }
之后保留@IsEnum(Timezones)验证即可生效:
@IsEnum(Timezones) timezone: string;
方案2:不修改枚举,改用@IsIn验证
如果不想调整枚举定义,可使用@IsIn装饰器,传入枚举的键数组(即时区字符串集合):
import { IsIn } from 'class-validator'; // ... @IsIn(Object.keys(Timezones)) timezone: string;
内容的提问来源于stack exchange,提问作者user13437588
相关产品推荐
相关产品推荐

