schema-dsl 可选标记 ? 支持
版本: v1.1.4+
更新日期: 2026-01-13
📋 功能概述
schema-dsl 现在支持使用 ? 显式标记可选字段,提供更清晰的语义表达。
支持的标记
✅ 支持的语法
1. 基础类型 + ?
2. 带约束的类型 + ?
3. 格式类型 + ?
4. 数组类型 + ?
🎯 语义对比
string vs string?
虽然两者行为相同(都是可选),但语义不同:
推荐使用 ? 的场景:
- 需要明确表达"此字段是故意设计为可选的"
- 与其他必填字段对比时,增强代码可读性
- 团队规范要求显式标记可选字段
示例:
⚠️ 注意事项
1. 枚举类型中的 ?
当 ? 出现在枚举值中时,需要特别注意:
2. 优先级规则
当 ! 和 ? 同时出现时(虽然不推荐),! 优先:
3. 对象字段的可选
📊 实际测试结果
测试统计
- ✅ string? - 支持
- ✅ string:3-32? - 支持
- ✅ email? - 支持
- ✅ number:18-? - 支持
- ✅ array
? - 支持 - ✅ 相关单元测试已覆盖
测试代码
🔧 实现细节
DslParser / DslBuilder 标记处理
当前版本会在 DslParser.parseString() 中统一剥离末尾 ! / ?,同时 DslBuilder 构造函数保留相同的兼容处理,因此字符串 DSL 和链式 Builder 两条入口都能识别可选标记。
📝 最佳实践
推荐的使用方式
代码审查清单
在代码审查时,检查以下事项:
- 所有必填字段都使用
!标记 - 可选字段根据团队规范决定是否使用
? - 枚举类型中没有错误地使用
?(如active|inactive?) - 复杂约束的可选字段正确使用(如
string:3-32?)
🔄 版本兼容性
- v1.1.3 及之前:
?被忽略,但不影响功能(因为默认可选) - v1.1.4+:
?被显式处理,语义更清晰
向后兼容:✅ 完全兼容,所有现有代码无需修改
📚 相关文档
最后更新: 2026-01-13
作者: schema-dsl Team
对应示例文件
示例入口: optional-marker-guide.ts
说明: 覆盖 ! / ? 的基础字段、对象字段和默认可选枚举场景,直接展示成功 / 失败路径。