DSL 语法完整指南
更新时间: 2025-12-25
📑 目录
快速开始
完整类型列表
基本类型
格式类型
特殊类型
基础语法
1. 类型定义
2. 必填与可选标记
使用 ! 标记必填字段,使用 ? 显式标记可选字段:
说明:
!- 必填标记,字段必须存在?- 可选标记,字段可省略(显式表达)- 不加标记 - 默认可选(字段可省略)
推荐:
- 使用
!明确标记必填字段 - 使用
?在需要明确表达"可选"时增强代码可读性
3. 对象必填
支持两种方式:
约束语法
1. 字符串长度
示例:
2. 数字范围
示例:
3. 枚举值
使用 | 分隔枚举值:
4. types: 联合类型
当一个字段需要接受多种不同类型时,可以使用 types: 前缀生成联合类型:
这个语法会被编译为 oneOf 结构,适合表达“满足其中任意一种类型即可”的场景。
适用场景:
- 联系方式允许邮箱或手机号
- 价格字段允许数值或说明字符串
- 兼容历史接口中同字段的多种输入格式
5. 特殊约束
支持特定格式的约束:
示例:
数组语法
1. 基础数组
2. 数组长度约束
示例:
3. 数组元素约束
4. 嵌套数组
对象语法
1. 基础对象
2. 嵌套对象
3. 混合嵌套
条件验证 (Match)
支持更优雅的条件验证语法 dsl.match 和 dsl.if。
1. dsl.match (推荐)
类似于 switch-case,根据某个字段的值决定当前字段的验证规则。
语法:
示例:
处理非英文值: 如果条件值包含中文、数字或特殊字符,给键名加上引号即可:
2. dsl.if (简单条件)
适用于简单的二选一场景。
语法:
示例:
高级用法
1. 链式调用
⚠️
.custom()当前仅支持同步自定义逻辑;异步业务校验请在验证通过后单独执行。
2. 默认验证器
注意事项
1. 条件验证
⚠️ 注意: DSL 字符串不支持直接写条件逻辑
解决方案: 使用 dsl.match (推荐)
2. 数组约束
✅ 推荐: 使用简洁的 DSL 语法
⚠️ 也可以: 使用完整 JSON Schema 格式(不推荐,太繁琐)
3. 正则验证
⚠️ 注意: DSL 字符串不支持直接写正则
解决方案: 使用 .pattern() 方法
4. 自定义验证
⚠️ 注意: DSL 字符串不支持自定义逻辑
解决方案: 使用 .custom() 方法承载同步自定义逻辑
异步校验(如数据库查重)请在 validate() / validateAsync() 通过后于业务层单独执行。
5. 对象数组详细定义
⚠️ 注意: DSL 简写不支持对象数组的详细定义
解决方案: 使用完整对象定义
完整示例
用户注册表单
电商商品 Schema
API 请求验证
常见问题
Q1: 为什么移除了简写功能?
A: 为了降低学习成本和减少歧义。使用完整类型名更清晰,特别是对新手更友好。
Q2: 数组长度约束怎么写?
A: 支持直接在DSL中写:
Q3: 如何定义对象数组?
A: 使用完整对象定义:
Q4: 不支持条件验证吗?
A: 支持。推荐使用 dsl.match:
Q5: 能用正则验证吗?
A: 能,使用 .pattern() 方法:
相关文档
对应示例文件
示例入口: dsl-syntax.ts
说明: 覆盖 Batch 1 中 DSL 语法的基础类型、约束、枚举、数组和嵌套对象写法,可直接运行参考。
最后更新: 2026-05-08
作者: schema-dsl Team