You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:35:22