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

如何在FeathersJS TypeBox Schema中指定条件必填字段?

解决FeathersJS中TypeBox Schema的条件必填字段问题

要实现当isCompany为true时companyName必填的需求,有两种常用方案:

方案1:使用Type.Union拆分场景

通过联合类型分别定义isCompany为true和false时的数据结构,明确不同场景下的字段要求:

import { Type } from '@feathersjs/typebox'
// 假设ObjectIdSchema是你定义的ObjectID类型
const ObjectIdSchema = () => Type.String({ format: 'objectid' })

export const userSchema = Type.Union([
  // isCompany为true时,companyName必填
  Type.Object({
    _id: ObjectIdSchema(),
    email: Type.String({ format: 'email' }),
    password: Type.String({ minLength: 6 }),
    isCompany: Type.Literal(true),
    companyName: Type.String()
  }, { additionalProperties: false }),
  // isCompany为false时,companyName可选或省略
  Type.Object({
    _id: ObjectIdSchema(),
    email: Type.String({ format: 'email' }),
    password: Type.String({ minLength: 6 }),
    isCompany: Type.Literal(false),
    companyName: Type.Optional(Type.String())
  }, { additionalProperties: false })
], { $id: 'User' })

方案2:使用AJV原生if/then/else规则

直接在主对象配置中添加AJV的条件验证关键字,更贴近你最初的伪代码思路:

import { Type } from '@feathersjs/typebox'
const ObjectIdSchema = () => Type.String({ format: 'objectid' })

export const userSchema = Type.Object(
  {
    _id: ObjectIdSchema(),
    email: Type.String({ format: 'email' }),
    password: Type.String({ minLength: 6 }),
    isCompany: Type.Boolean(),
    companyName: Type.Optional(Type.String()) // 先标记为基础可选字段
  },
  {
    $id: 'User',
    additionalProperties: false,
    // 配置AJV条件验证规则
    if: Type.Object({ isCompany: Type.Literal(true) }),
    then: Type.Object({ companyName: Type.String() }) // 条件满足时强制companyName必填
  }
)

补充说明

  • FeathersJS默认集成的AJV会自动识别if/then/else关键字,无需额外配置
  • 方案1的联合类型在TypeScript编译阶段就能提供严格的类型提示;方案2更灵活,适合对TS类型约束要求不高的场景

内容的提问来源于stack exchange,提问作者mp035

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:07:13