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

如何校验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的类型适配也非常完善:

  1. 首先安装依赖:npm install zod
  2. 定义校验规则并使用:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:15:03