如何在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
相关产品推荐
相关产品推荐

