如何校验JSON对象属性值是否属于指定TypeScript枚举?
原有校验逻辑失效原因
你使用in运算符的核心逻辑错误:in是判断指定值是否为对象的键名,而你要校验的是前端传入的值是否属于枚举的值集合。虽然你当前的字符串枚举键名和值完全相同,看起来可以临时生效,但一旦后续修改枚举键值映射就会直接失效,同时也没有对body本身的合法性做前置校验。
方案1:无第三方依赖的原生实现
直接通过Object.values()提取枚举的所有有效值,再用includes()判断传入参数是否在合法值集合内:
if (body && typeof body === 'object' && 'type' in body && 'frequency' in body) { const isLegalType = Object.values(NotificationType).includes(body.type as NotificationType); const isLegalFrequency = Object.values(FrequencyType).includes(body.frequency as FrequencyType); if (isLegalType && isLegalFrequency) { // 校验通过,此时body可安全断言为Notifications类型 const notification = body as Notifications; // 执行后续业务逻辑 } }
方案2:更易维护的Schema校验(推荐)
如果项目允许引入依赖,推荐使用Zod这类运行时校验库,后续字段扩展、错误返回都更省心,和TS的类型适配也非常完善:
- 首先安装依赖:
npm install zod - 定义校验规则并使用:
import { z } from 'zod'; // 基于已有枚举定义校验Schema const NotificationSchema = z.object({ type: z.nativeEnum(NotificationType), frequency: z.nativeEnum(FrequencyType) }); // 执行校验 const validateResult = NotificationSchema.safeParse(body); if (validateResult.success) { // validateResult.data自动获得Notifications类型,无需手动断言 const notification = validateResult.data; // 执行业务逻辑 } else { // 可直接返回结构化的校验错误给前端 return { statusCode: 400, body: JSON.stringify({ msg: "参数校验失败", errors: validateResult.error.issues }) }; }
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

