schema-dsl 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/CHANGELOG.md +130 -113
  2. package/LICENSE +21 -21
  3. package/README.md +628 -628
  4. package/dist/{DslBuilder-DkLaOo9Q.d.ts → DslBuilder-BIgQOAXp.d.ts} +2 -0
  5. package/dist/{DslBuilder-DQDN0ZxZ.d.cts → DslBuilder-CjHTucNQ.d.cts} +2 -0
  6. package/dist/{Validator-hFWKGxir.d.ts → Validator-CllRdrY0.d.ts} +1 -1
  7. package/dist/{Validator-C7GsVQOH.d.cts → Validator-D6okG9tr.d.cts} +1 -1
  8. package/dist/index.cjs +75 -29
  9. package/dist/index.d.cts +10 -4
  10. package/dist/index.d.ts +10 -4
  11. package/dist/index.js +75 -29
  12. package/dist/plugins/custom-format.cjs +33 -17
  13. package/dist/plugins/custom-format.d.cts +1 -1
  14. package/dist/plugins/custom-format.d.ts +1 -1
  15. package/dist/plugins/custom-format.js +33 -17
  16. package/dist/plugins/custom-type-example.cjs +33 -17
  17. package/dist/plugins/custom-type-example.d.cts +1 -1
  18. package/dist/plugins/custom-type-example.d.ts +1 -1
  19. package/dist/plugins/custom-type-example.js +33 -17
  20. package/dist/plugins/custom-validator.cjs +0 -2
  21. package/dist/plugins/custom-validator.d.cts +1 -1
  22. package/dist/plugins/custom-validator.d.ts +1 -1
  23. package/dist/plugins/custom-validator.js +0 -2
  24. package/docs/FEATURE-INDEX.md +553 -553
  25. package/docs/add-custom-locale.md +496 -496
  26. package/docs/add-keyword.md +24 -24
  27. package/docs/api-reference.md +1047 -1047
  28. package/docs/api.md +13 -13
  29. package/docs/best-practices-project-structure.md +417 -417
  30. package/docs/best-practices.md +712 -712
  31. package/docs/cache-manager.md +344 -344
  32. package/docs/compile.md +45 -45
  33. package/docs/conditional-api.md +1307 -1307
  34. package/docs/custom-extensions-guide.md +339 -339
  35. package/docs/design-philosophy.md +606 -606
  36. package/docs/doc-index.md +324 -324
  37. package/docs/dsl-syntax.md +714 -714
  38. package/docs/dynamic-locale.md +608 -608
  39. package/docs/enum.md +482 -482
  40. package/docs/error-handling.md +1975 -1975
  41. package/docs/export-guide.md +501 -501
  42. package/docs/export-limitations.md +567 -567
  43. package/docs/faq.md +596 -596
  44. package/docs/frontend-i18n-guide.md +307 -307
  45. package/docs/i18n-user-guide.md +487 -487
  46. package/docs/i18n.md +476 -476
  47. package/docs/index.md +48 -48
  48. package/docs/json-schema-basics.md +40 -40
  49. package/docs/label-vs-description.md +271 -271
  50. package/docs/markdown-exporter.md +406 -406
  51. package/docs/mongodb-exporter.md +302 -302
  52. package/docs/multi-language.md +26 -26
  53. package/docs/multi-type-support.md +322 -322
  54. package/docs/mysql-exporter.md +280 -280
  55. package/docs/number-operators.md +449 -449
  56. package/docs/optional-marker-guide.md +326 -326
  57. package/docs/performance-guide.md +49 -49
  58. package/docs/plugin-system.md +381 -381
  59. package/docs/plugin-type-registration.md +34 -34
  60. package/docs/postgresql-exporter.md +311 -311
  61. package/docs/public/favicon.svg +4 -4
  62. package/docs/quick-start.md +435 -435
  63. package/docs/runtime-locale-support.md +532 -532
  64. package/docs/schema-helper.md +345 -345
  65. package/docs/schema-utils-advanced-issues.md +23 -23
  66. package/docs/schema-utils-best-practices.md +20 -20
  67. package/docs/schema-utils-chaining.md +150 -150
  68. package/docs/schema-utils.md +524 -524
  69. package/docs/security-checklist.md +20 -20
  70. package/docs/string-extensions.md +488 -488
  71. package/docs/troubleshooting.md +486 -486
  72. package/docs/type-converter.md +310 -310
  73. package/docs/type-reference.md +242 -242
  74. package/docs/typescript-guide.md +584 -584
  75. package/docs/union-type-guide.md +157 -157
  76. package/docs/union-types.md +284 -284
  77. package/docs/validate-async.md +491 -491
  78. package/docs/validate-batch.md +49 -49
  79. package/docs/validate-dsl-object-support.md +578 -578
  80. package/docs/validate.md +506 -506
  81. package/docs/validation-guide.md +502 -502
  82. package/docs/validator.md +39 -39
  83. package/package.json +131 -131
  84. package/plugins/custom-format.cjs +8 -8
  85. package/plugins/custom-type-example.cjs +8 -8
  86. package/plugins/custom-validator.cjs +8 -8
  87. package/src/adapters/DslAdapter.ts +111 -111
  88. package/src/adapters/index.ts +1 -1
  89. package/src/config/constants.ts +83 -83
  90. package/src/config/index.ts +2 -2
  91. package/src/config/patterns.ts +77 -77
  92. package/src/core/CacheManager.ts +169 -159
  93. package/src/core/ConditionalBuilder.ts +382 -382
  94. package/src/core/ConditionalRuntime.ts +27 -27
  95. package/src/core/ConditionalValidator.ts +254 -254
  96. package/src/core/DslBuilder.ts +687 -677
  97. package/src/core/ErrorCodes.ts +38 -38
  98. package/src/core/ErrorFormatter.ts +271 -271
  99. package/src/core/JSONSchemaCore.ts +65 -65
  100. package/src/core/Locale.ts +187 -187
  101. package/src/core/MessageTemplate.ts +42 -42
  102. package/src/core/ObjectDslBuilder.ts +64 -64
  103. package/src/core/PluginManager.ts +326 -326
  104. package/src/core/StringExtensions.ts +140 -140
  105. package/src/core/TemplateEngine.ts +44 -44
  106. package/src/core/Validator.ts +448 -448
  107. package/src/errors/I18nError.ts +159 -159
  108. package/src/errors/ValidationError.ts +105 -105
  109. package/src/exporters/BaseExporter.ts +60 -60
  110. package/src/exporters/MarkdownExporter.ts +305 -305
  111. package/src/exporters/MongoDBExporter.ts +126 -126
  112. package/src/exporters/MySQLExporter.ts +156 -155
  113. package/src/exporters/PostgreSQLExporter.ts +222 -222
  114. package/src/exporters/index.ts +18 -18
  115. package/src/index.ts +651 -633
  116. package/src/locales/en-US.ts +160 -160
  117. package/src/locales/es-ES.ts +160 -160
  118. package/src/locales/fr-FR.ts +160 -160
  119. package/src/locales/index.ts +103 -103
  120. package/src/locales/ja-JP.ts +160 -160
  121. package/src/locales/types.ts +156 -156
  122. package/src/locales/zh-CN.ts +160 -160
  123. package/src/parser/ConstraintParser.ts +101 -101
  124. package/src/parser/DslParser.ts +470 -470
  125. package/src/parser/SchemaCompiler.ts +66 -66
  126. package/src/parser/TypeRegistry.ts +250 -250
  127. package/src/parser/index.ts +6 -6
  128. package/src/plugins/custom-format.ts +124 -126
  129. package/src/plugins/custom-type-example.ts +106 -108
  130. package/src/plugins/custom-validator.ts +138 -140
  131. package/src/types/conditional.ts +28 -28
  132. package/src/types/config.ts +59 -59
  133. package/src/types/dsl.ts +131 -131
  134. package/src/types/error.ts +60 -60
  135. package/src/types/index.ts +17 -17
  136. package/src/types/infer.ts +127 -127
  137. package/src/types/plugin.ts +58 -58
  138. package/src/types/safe-regex.d.ts +9 -9
  139. package/src/types/schema.ts +66 -66
  140. package/src/types/validate.ts +71 -71
  141. package/src/utils/SchemaHelper.ts +196 -196
  142. package/src/utils/SchemaUtils.ts +365 -346
  143. package/src/utils/TypeConverter.ts +215 -215
  144. package/src/utils/index.ts +10 -10
  145. package/src/validators/CustomKeywords.ts +477 -477
@@ -1,284 +1,284 @@
1
- # 跨类型联合验证 - types: 语法
2
-
3
- > **版本**: v1.1.0+
4
- > **状态**: ✅ 稳定
5
-
6
- ---
7
-
8
- ## 概述
9
-
10
- `types:` 语法允许您定义跨类型联合验证,支持字段匹配多种不同的数据类型。
11
-
12
- ### 特性
13
-
14
- ✅ **简洁语法** - `'types:string|number'` 一行搞定
15
- ✅ **带约束** - `'types:string:3-10|number:0-100'`
16
- ✅ **插件扩展** - 支持自定义类型注册
17
- ✅ **多语言** - 完整的i18n支持
18
-
19
- ---
20
-
21
- ## 快速开始
22
-
23
- ### 基础用法
24
-
25
- ```javascript
26
- const { dsl, validate } = require('schema-dsl');
27
-
28
- // 定义联合类型
29
- const schema = dsl({
30
- value: 'types:string|number'
31
- });
32
-
33
- // 验证
34
- validate(schema, { value: 'hello' }); // ✅ 通过
35
- validate(schema, { value: 123 }); // ✅ 通过
36
- validate(schema, { value: true }); // ❌ 失败
37
- ```
38
-
39
- ### 带约束
40
-
41
- ```javascript
42
- const schema = dsl({
43
- value: 'types:string:3-10|number:0-100!'
44
- });
45
-
46
- validate(schema, { value: 'abc' }); // ✅ 通过
47
- validate(schema, { value: 50 }); // ✅ 通过
48
- validate(schema, { value: 'ab' }); // ❌ 太短
49
- validate(schema, { value: 101 }); // ❌ 超范围
50
- ```
51
-
52
- ---
53
-
54
- ## 语法说明
55
-
56
- ### 基本格式
57
-
58
- ```text
59
- types:type1|type2|type3[!]
60
- ```
61
-
62
- - `types:` - 固定前缀
63
- - `type1|type2` - 类型列表,用 `|` 分隔
64
- - `!` - 可选的必填标记
65
-
66
- ### 带约束格式
67
-
68
- ```text
69
- types:type1:constraint1|type2:constraint2
70
- ```
71
-
72
- ---
73
-
74
- ## 支持的类型
75
-
76
- ### 内置类型
77
-
78
- 所有内置类型都可以在 `types:` 中使用:
79
-
80
- - **基本类型**: `string`, `number`, `integer`, `boolean`, `null`, `any`
81
- - **格式类型**: `email`, `url`, `uuid`, `date`, `datetime`, `time`
82
- - **特殊类型**: `phone`, `idCard`, `objectId`, `hexColor` 等
83
-
84
- ### 插件自定义类型
85
-
86
- 通过插件注册的自定义类型也可以使用:
87
-
88
- ```javascript
89
- const { DslBuilder, PluginManager } = require('schema-dsl');
90
-
91
- // 注册自定义类型
92
- DslBuilder.registerType('order-id', {
93
- type: 'string',
94
- pattern: /^ORD[0-9]{12}$/.source,
95
- minLength: 15,
96
- maxLength: 15
97
- });
98
-
99
- // 在types:中使用
100
- const schema = dsl({
101
- identifier: 'types:uuid|order-id'
102
- });
103
- ```
104
-
105
- ---
106
-
107
- ## 实际应用场景
108
-
109
- ### 场景1:用户注册(邮箱或手机号)
110
-
111
- ```javascript
112
- const registerSchema = dsl({
113
- username: 'string:3-20!',
114
- password: 'string:8-20!',
115
- contact: 'types:email|phone!' // 邮箱或手机号
116
- });
117
- ```
118
-
119
- ### 场景2:灵活的价格输入
120
-
121
- ```javascript
122
- const productSchema = dsl({
123
- price: 'types:number:0-|string:1-20' // 数字价格或"面议"
124
- });
125
-
126
- validate(productSchema, { price: 99.99 }); // ✅ 数字
127
- validate(productSchema, { price: '面议' }); // ✅ 字符串
128
- ```
129
-
130
- ### 场景3:订单查询(订单号或SKU)
131
-
132
- ```javascript
133
- // 先注册自定义类型
134
- DslBuilder.registerType('order-id', { ... });
135
- DslBuilder.registerType('sku', { ... });
136
-
137
- const querySchema = dsl({
138
- identifier: 'types:order-id|sku!'
139
- });
140
- ```
141
-
142
- ---
143
-
144
- ## 插件开发指南
145
-
146
- ### 注册自定义类型
147
-
148
- ```javascript
149
- // 在插件的install方法中
150
- install(schemaDsl, options, context) {
151
- const { DslBuilder } = schemaDsl;
152
-
153
- // 注册DSL类型
154
- DslBuilder.registerType('custom-type', {
155
- type: 'string',
156
- pattern: /^CUSTOM-\d+$/.source,
157
- minLength: 8,
158
- maxLength: 20
159
- });
160
-
161
- // 同时注册ajv format(可选)
162
- const validator = schemaDsl.getDefaultValidator();
163
- const ajv = validator.getAjv();
164
- ajv.addFormat('custom-type', {
165
- validate: /^CUSTOM-\d+$/
166
- });
167
- }
168
- ```
169
-
170
- ### DslBuilder API
171
-
172
- #### `DslBuilder.registerType(name, schema)`
173
-
174
- 注册自定义类型。
175
-
176
- **参数**:
177
- - `name` (string) - 类型名称
178
- - `schema` (Object|Function) - JSON Schema对象或生成函数
179
-
180
- #### `DslBuilder.hasType(type)`
181
-
182
- 检查类型是否已注册。
183
-
184
- #### `DslBuilder.getCustomTypes()`
185
-
186
- 获取所有已注册的自定义类型。
187
-
188
- #### `DslBuilder.clearCustomTypes()`
189
-
190
- 清除所有自定义类型(主要用于测试)。
191
-
192
- ---
193
-
194
- ## 多语言支持
195
-
196
- ### 中文
197
-
198
- ```javascript
199
- validate(schema, { value: true }, { locale: 'zh-CN' });
200
- // 错误: "必须匹配以下类型之一"
201
- ```
202
-
203
- ### 英文
204
-
205
- ```javascript
206
- validate(schema, { value: true }, { locale: 'en-US' });
207
- // Error: "Must match one of the following types"
208
- ```
209
-
210
- 支持的语言:`zh-CN`, `en-US`, `es-ES`, `fr-FR`, `ja-JP`
211
-
212
- ---
213
-
214
- ## 最佳实践
215
-
216
- ### 1. 优先使用内置类型
217
-
218
- ```javascript
219
- // ✅ 推荐
220
- 'types:email|phone'
221
-
222
- // ⚠️ 不推荐(性能较差)
223
- 'types:string:custom-email-pattern|string:custom-phone-pattern'
224
- ```
225
-
226
- ### 2. 合理使用约束
227
-
228
- ```javascript
229
- // ✅ 明确约束
230
- 'types:string:3-32|number:0-100'
231
-
232
- // ❌ 过于宽松
233
- 'types:string|number' // 没有约束
234
- ```
235
-
236
- ### 3. 插件类型命名规范
237
-
238
- ```javascript
239
- // ✅ 使用kebab-case
240
- DslBuilder.registerType('order-id', { ... });
241
- DslBuilder.registerType('phone-cn', { ... });
242
-
243
- // ❌ 不推荐
244
- DslBuilder.registerType('OrderID', { ... });
245
- DslBuilder.registerType('phone_cn', { ... });
246
- ```
247
-
248
- ---
249
-
250
- ## 注意事项
251
-
252
- ### oneOf语义
253
-
254
- `types:` 语法内部使用JSON Schema的 `oneOf`,表示"恰好匹配其中一种类型"。
255
-
256
- ### 性能考虑
257
-
258
- 联合类型会依次验证每个类型,直到匹配成功。类型越多,性能开销越大。
259
-
260
- **建议**:
261
- - 联合类型数量控制在5个以内
262
- - 将最常用的类型放在前面
263
-
264
- ---
265
-
266
- ## 相关文档
267
-
268
- - [插件系统](./plugin-system.md)
269
- - [自定义类型注册](./plugin-type-registration.md)
270
- - [贡献指南](https://github.com/vextjs/schema-dsl/blob/main/CONTRIBUTING.md)
271
-
272
- ---
273
-
274
- ## 版本历史
275
-
276
- - **v1.1.0** - 首次发布跨类型联合验证功能
277
-
278
- ---
279
-
280
- ## 对应示例文件
281
-
282
- **示例入口**: [union-types.ts](https://github.com/vextjs/schema-dsl/blob/main/examples/docs/union-types.ts)
283
- **说明**: 覆盖 `types:` 语法的 `oneOf` 生成、字符串/数字联合,以及内置类型与自定义类型混用路径。
284
-
1
+ # 跨类型联合验证 - types: 语法
2
+
3
+ > **版本**: v1.1.0+
4
+ > **状态**: ✅ 稳定
5
+
6
+ ---
7
+
8
+ ## 概述
9
+
10
+ `types:` 语法允许您定义跨类型联合验证,支持字段匹配多种不同的数据类型。
11
+
12
+ ### 特性
13
+
14
+ ✅ **简洁语法** - `'types:string|number'` 一行搞定
15
+ ✅ **带约束** - `'types:string:3-10|number:0-100'`
16
+ ✅ **插件扩展** - 支持自定义类型注册
17
+ ✅ **多语言** - 完整的i18n支持
18
+
19
+ ---
20
+
21
+ ## 快速开始
22
+
23
+ ### 基础用法
24
+
25
+ ```javascript
26
+ const { dsl, validate } = require('schema-dsl');
27
+
28
+ // 定义联合类型
29
+ const schema = dsl({
30
+ value: 'types:string|number'
31
+ });
32
+
33
+ // 验证
34
+ validate(schema, { value: 'hello' }); // ✅ 通过
35
+ validate(schema, { value: 123 }); // ✅ 通过
36
+ validate(schema, { value: true }); // ❌ 失败
37
+ ```
38
+
39
+ ### 带约束
40
+
41
+ ```javascript
42
+ const schema = dsl({
43
+ value: 'types:string:3-10|number:0-100!'
44
+ });
45
+
46
+ validate(schema, { value: 'abc' }); // ✅ 通过
47
+ validate(schema, { value: 50 }); // ✅ 通过
48
+ validate(schema, { value: 'ab' }); // ❌ 太短
49
+ validate(schema, { value: 101 }); // ❌ 超范围
50
+ ```
51
+
52
+ ---
53
+
54
+ ## 语法说明
55
+
56
+ ### 基本格式
57
+
58
+ ```text
59
+ types:type1|type2|type3[!]
60
+ ```
61
+
62
+ - `types:` - 固定前缀
63
+ - `type1|type2` - 类型列表,用 `|` 分隔
64
+ - `!` - 可选的必填标记
65
+
66
+ ### 带约束格式
67
+
68
+ ```text
69
+ types:type1:constraint1|type2:constraint2
70
+ ```
71
+
72
+ ---
73
+
74
+ ## 支持的类型
75
+
76
+ ### 内置类型
77
+
78
+ 所有内置类型都可以在 `types:` 中使用:
79
+
80
+ - **基本类型**: `string`, `number`, `integer`, `boolean`, `null`, `any`
81
+ - **格式类型**: `email`, `url`, `uuid`, `date`, `datetime`, `time`
82
+ - **特殊类型**: `phone`, `idCard`, `objectId`, `hexColor` 等
83
+
84
+ ### 插件自定义类型
85
+
86
+ 通过插件注册的自定义类型也可以使用:
87
+
88
+ ```javascript
89
+ const { DslBuilder, PluginManager } = require('schema-dsl');
90
+
91
+ // 注册自定义类型
92
+ DslBuilder.registerType('order-id', {
93
+ type: 'string',
94
+ pattern: /^ORD[0-9]{12}$/.source,
95
+ minLength: 15,
96
+ maxLength: 15
97
+ });
98
+
99
+ // 在types:中使用
100
+ const schema = dsl({
101
+ identifier: 'types:uuid|order-id'
102
+ });
103
+ ```
104
+
105
+ ---
106
+
107
+ ## 实际应用场景
108
+
109
+ ### 场景1:用户注册(邮箱或手机号)
110
+
111
+ ```javascript
112
+ const registerSchema = dsl({
113
+ username: 'string:3-20!',
114
+ password: 'string:8-20!',
115
+ contact: 'types:email|phone!' // 邮箱或手机号
116
+ });
117
+ ```
118
+
119
+ ### 场景2:灵活的价格输入
120
+
121
+ ```javascript
122
+ const productSchema = dsl({
123
+ price: 'types:number:0-|string:1-20' // 数字价格或"面议"
124
+ });
125
+
126
+ validate(productSchema, { price: 99.99 }); // ✅ 数字
127
+ validate(productSchema, { price: '面议' }); // ✅ 字符串
128
+ ```
129
+
130
+ ### 场景3:订单查询(订单号或SKU)
131
+
132
+ ```javascript
133
+ // 先注册自定义类型
134
+ DslBuilder.registerType('order-id', { ... });
135
+ DslBuilder.registerType('sku', { ... });
136
+
137
+ const querySchema = dsl({
138
+ identifier: 'types:order-id|sku!'
139
+ });
140
+ ```
141
+
142
+ ---
143
+
144
+ ## 插件开发指南
145
+
146
+ ### 注册自定义类型
147
+
148
+ ```javascript
149
+ // 在插件的install方法中
150
+ install(schemaDsl, options, context) {
151
+ const { DslBuilder } = schemaDsl;
152
+
153
+ // 注册DSL类型
154
+ DslBuilder.registerType('custom-type', {
155
+ type: 'string',
156
+ pattern: /^CUSTOM-\d+$/.source,
157
+ minLength: 8,
158
+ maxLength: 20
159
+ });
160
+
161
+ // 同时注册ajv format(可选)
162
+ const validator = schemaDsl.getDefaultValidator();
163
+ const ajv = validator.getAjv();
164
+ ajv.addFormat('custom-type', {
165
+ validate: /^CUSTOM-\d+$/
166
+ });
167
+ }
168
+ ```
169
+
170
+ ### DslBuilder API
171
+
172
+ #### `DslBuilder.registerType(name, schema)`
173
+
174
+ 注册自定义类型。
175
+
176
+ **参数**:
177
+ - `name` (string) - 类型名称
178
+ - `schema` (Object|Function) - JSON Schema对象或生成函数
179
+
180
+ #### `DslBuilder.hasType(type)`
181
+
182
+ 检查类型是否已注册。
183
+
184
+ #### `DslBuilder.getCustomTypes()`
185
+
186
+ 获取所有已注册的自定义类型。
187
+
188
+ #### `DslBuilder.clearCustomTypes()`
189
+
190
+ 清除所有自定义类型(主要用于测试)。
191
+
192
+ ---
193
+
194
+ ## 多语言支持
195
+
196
+ ### 中文
197
+
198
+ ```javascript
199
+ validate(schema, { value: true }, { locale: 'zh-CN' });
200
+ // 错误: "必须匹配以下类型之一"
201
+ ```
202
+
203
+ ### 英文
204
+
205
+ ```javascript
206
+ validate(schema, { value: true }, { locale: 'en-US' });
207
+ // Error: "Must match one of the following types"
208
+ ```
209
+
210
+ 支持的语言:`zh-CN`, `en-US`, `es-ES`, `fr-FR`, `ja-JP`
211
+
212
+ ---
213
+
214
+ ## 最佳实践
215
+
216
+ ### 1. 优先使用内置类型
217
+
218
+ ```javascript
219
+ // ✅ 推荐
220
+ 'types:email|phone'
221
+
222
+ // ⚠️ 不推荐(性能较差)
223
+ 'types:string:custom-email-pattern|string:custom-phone-pattern'
224
+ ```
225
+
226
+ ### 2. 合理使用约束
227
+
228
+ ```javascript
229
+ // ✅ 明确约束
230
+ 'types:string:3-32|number:0-100'
231
+
232
+ // ❌ 过于宽松
233
+ 'types:string|number' // 没有约束
234
+ ```
235
+
236
+ ### 3. 插件类型命名规范
237
+
238
+ ```javascript
239
+ // ✅ 使用kebab-case
240
+ DslBuilder.registerType('order-id', { ... });
241
+ DslBuilder.registerType('phone-cn', { ... });
242
+
243
+ // ❌ 不推荐
244
+ DslBuilder.registerType('OrderID', { ... });
245
+ DslBuilder.registerType('phone_cn', { ... });
246
+ ```
247
+
248
+ ---
249
+
250
+ ## 注意事项
251
+
252
+ ### oneOf语义
253
+
254
+ `types:` 语法内部使用JSON Schema的 `oneOf`,表示"恰好匹配其中一种类型"。
255
+
256
+ ### 性能考虑
257
+
258
+ 联合类型会依次验证每个类型,直到匹配成功。类型越多,性能开销越大。
259
+
260
+ **建议**:
261
+ - 联合类型数量控制在5个以内
262
+ - 将最常用的类型放在前面
263
+
264
+ ---
265
+
266
+ ## 相关文档
267
+
268
+ - [插件系统](./plugin-system.md)
269
+ - [自定义类型注册](./plugin-type-registration.md)
270
+ - [贡献指南](https://github.com/vextjs/schema-dsl/blob/main/CONTRIBUTING.md)
271
+
272
+ ---
273
+
274
+ ## 版本历史
275
+
276
+ - **v1.1.0** - 首次发布跨类型联合验证功能
277
+
278
+ ---
279
+
280
+ ## 对应示例文件
281
+
282
+ **示例入口**: [union-types.ts](https://github.com/vextjs/schema-dsl/blob/main/examples/docs/union-types.ts)
283
+ **说明**: 覆盖 `types:` 语法的 `oneOf` 生成、字符串/数字联合,以及内置类型与自定义类型混用路径。
284
+