多类型支持设计说明
📖 快速导航
- 单一类型验证(本文档)
- 联合类型验证 - 使用
types:语法做真正的跨类型联合验证
🎯 设计原理
schema-dsl通过类型无关的Builder模式实现多类型支持。
核心设计
📊 类型支持矩阵
🔧 实现机制
1. 类型解析(DslBuilder构造函数)
2. 方法适配(方法内部检查类型)
💡 String扩展的多类型支持
String扩展只支持字符串类型,这是设计决定:
为什么这样设计?
- 类型安全: 避免在数字类型上调用字符串方法
- 语义清晰:
'number:18-120'本身就表达了约束 - 简洁优先: 80%的复杂验证都是字符串,重点优化字符串体验
🎨 各类型的推荐用法
字符串类型(支持链式)
数字类型(纯DSL)
布尔类型(纯DSL)
日期类型(纯DSL)
枚举类型(纯DSL)
数组类型(纯DSL)
🚀 扩展新类型
当前版本优先通过公开运行时 API 扩展类型,而不是要求业务方修改内部 DslAdapter / ErrorCodes 源码。
推荐入口
使用方式
📋 类型方法兼容性矩阵
条件验证: 使用 dsl.match() 或 dsl.if() 静态方法。
说明:
- ✅ 完全支持
- ❌ 不支持(会被忽略或警告)
🎯 最佳实践
1. 根据类型选择表达方式
2. String扩展只用于字符串
3. 复杂验证用custom
💡 总结
schema-dsl 的多类型支持采用类型无关 Builder + 方法智能适配设计:
- 统一入口: 所有类型都通过DslBuilder
- 类型感知: 方法内部检查类型兼容性
- 简洁优先: String扩展专注字符串(80%的复杂场景)
- 渐进增强: 简单用DSL,复杂用链式,特殊用custom
设计哲学: 让最常见的场景(字符串验证)最简洁,其他类型保持DSL的简洁性。
对应示例文件
示例入口: multi-type-support.ts
说明: 用一个对象同时覆盖字符串、数字、布尔、日期、数组和枚举字段的推荐写法,以及对应的成功 / 失败验证路径。