自定义扩展指南
版本: 2.0.0-beta.2
更新日期: 2026-05-08
用途: 说明当前版本推荐的运行时扩展方式,以及在维护 schema-dsl 自身源码时如何继续深入扩展
📑 目录
快速开始
schema-dsl采用模块化设计,你可以轻松扩展:
Validator.addKeyword()- 运行时注册自定义 AJV 关键字TypeRegistry.register()/DslBuilder.registerType()- 注册自定义 DSL 类型PluginManager+schema-dsl/plugins/*- 组合插件、hook 与官方插件入口Locale.addLocale()/dsl.config({ i18n })- 扩展多语言消息
当前版本推荐路径
⚠️ 如果你是把
schema-dsl当成依赖使用,优先通过公开运行时 API 扩展,而不是直接修改src/*。 只有在你维护schema-dsl自身源码时,才需要继续阅读后面的“修改内部模块”类示例。
- 自定义关键字:优先用
new Validator().addKeyword(name, definition) - 自定义类型:优先用
TypeRegistry.register()或DslBuilder.registerType() - 官方插件:优先用
PluginManager配合schema-dsl/plugins/custom-format、schema-dsl/plugins/custom-validator、schema-dsl/plugins/custom-type-example - 自定义语言:优先用
Locale.addLocale()或dsl.config({ i18n: { locales } })
添加自定义AJV关键字
步骤1:通过公开 API 注册关键字
步骤2:需要复用时,再封装成插件
注册自定义 DSL 类型
运行时推荐写法
低层入口
如果你要扩展
schema-dsl自身源码,才需要继续修改DslBuilder内部方法或 parser/compiler 逻辑。
封装预定义模式
当前版本更推荐用“自定义类型 + 现有约束”或“插件”来封装预定义模式,而不是直接要求业务侧修改包内 src/config/patterns/*。
多语言支持
添加新语言
- 运行时追加语言
- 或通过配置对象集中注入
- 使用新语言
自定义错误消息
完整示例
示例1:银行卡号验证器
示例2:IP段验证器
最佳实践
1. 命名规范
- 关键字:小驼峰,如
phoneLocation - 方法名:小驼峰,如
.phoneLocation() - 消息键:点分隔,如
phone.location.mismatch
2. 错误消息
- 使用占位符:
{{#label}},{{#limit}},{{#expected}} - 提供详细的错误信息
- 支持多语言
3. 性能优化
- 预编译正则表达式
- 避免复杂的循环
- 使用纯函数
4. 测试覆盖
参考资料
需要帮助? 访问 GitHub Issues
对应示例文件
示例入口: custom-extensions-guide.ts
说明: 以运行时公开 API 为主,覆盖 Validator.addKeyword()、DslBuilder.registerType()、Locale.addLocale() 和官方插件入口四条扩展路径。