schema-dsl 可选标记 ? 支持
📋 功能概述
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? 这类枚举 DSL:这里的 ? 属于最后一个枚举值,不代表整个字段可选。
🔄 版本兼容性
- v1.1.3 及之前:
?被忽略,但不影响功能(因为默认可选) - v1.1.4+:
?被显式处理,语义更清晰
向后兼容:✅ 完全兼容,所有现有代码无需修改
📚 相关文档
对应示例文件
示例入口: optional-marker-guide.ts
说明: 覆盖 ! / ? 的基础字段、对象字段和默认可选枚举场景,直接展示成功 / 失败路径。