schema-dsl 2.3.0

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 (109) hide show
  1. package/.eslintignore +10 -0
  2. package/.eslintrc.json +27 -0
  3. package/.github/CODE_OF_CONDUCT.md +45 -0
  4. package/.github/ISSUE_TEMPLATE/bug_report.md +57 -0
  5. package/.github/ISSUE_TEMPLATE/config.yml +11 -0
  6. package/.github/ISSUE_TEMPLATE/feature_request.md +45 -0
  7. package/.github/ISSUE_TEMPLATE/question.md +31 -0
  8. package/.github/PULL_REQUEST_TEMPLATE.md +70 -0
  9. package/.github/SECURITY.md +184 -0
  10. package/.github/workflows/ci.yml +35 -0
  11. package/CHANGELOG.md +633 -0
  12. package/CONTRIBUTING.md +368 -0
  13. package/LICENSE +21 -0
  14. package/README.md +1122 -0
  15. package/STATUS.md +273 -0
  16. package/docs/FEATURE-INDEX.md +521 -0
  17. package/docs/INDEX.md +224 -0
  18. package/docs/api-reference.md +1098 -0
  19. package/docs/best-practices.md +672 -0
  20. package/docs/cache-manager.md +336 -0
  21. package/docs/design-philosophy.md +602 -0
  22. package/docs/dsl-syntax.md +654 -0
  23. package/docs/dynamic-locale.md +552 -0
  24. package/docs/error-handling.md +703 -0
  25. package/docs/export-guide.md +459 -0
  26. package/docs/faq.md +576 -0
  27. package/docs/frontend-i18n-guide.md +290 -0
  28. package/docs/i18n-user-guide.md +488 -0
  29. package/docs/label-vs-description.md +262 -0
  30. package/docs/markdown-exporter.md +398 -0
  31. package/docs/mongodb-exporter.md +279 -0
  32. package/docs/multi-type-support.md +319 -0
  33. package/docs/mysql-exporter.md +257 -0
  34. package/docs/plugin-system.md +542 -0
  35. package/docs/postgresql-exporter.md +290 -0
  36. package/docs/quick-start.md +761 -0
  37. package/docs/schema-helper.md +340 -0
  38. package/docs/schema-utils.md +492 -0
  39. package/docs/string-extensions.md +480 -0
  40. package/docs/troubleshooting.md +471 -0
  41. package/docs/type-converter.md +319 -0
  42. package/docs/type-reference.md +219 -0
  43. package/docs/validate.md +486 -0
  44. package/docs/validation-guide.md +484 -0
  45. package/examples/array-dsl-example.js +227 -0
  46. package/examples/custom-extension.js +85 -0
  47. package/examples/dsl-match-example.js +74 -0
  48. package/examples/dsl-style.js +118 -0
  49. package/examples/dynamic-locale-configuration.js +348 -0
  50. package/examples/dynamic-locale-example.js +287 -0
  51. package/examples/export-demo.js +130 -0
  52. package/examples/i18n-full-demo.js +310 -0
  53. package/examples/i18n-memory-safety.examples.js +268 -0
  54. package/examples/markdown-export.js +71 -0
  55. package/examples/middleware-usage.js +93 -0
  56. package/examples/password-reset/README.md +153 -0
  57. package/examples/password-reset/schema.js +26 -0
  58. package/examples/password-reset/test.js +101 -0
  59. package/examples/plugin-system.examples.js +205 -0
  60. package/examples/simple-example.js +122 -0
  61. package/examples/string-extensions.js +297 -0
  62. package/examples/user-registration/README.md +156 -0
  63. package/examples/user-registration/routes.js +92 -0
  64. package/examples/user-registration/schema.js +150 -0
  65. package/examples/user-registration/server.js +74 -0
  66. package/index.d.ts +1999 -0
  67. package/index.js +270 -0
  68. package/index.mjs +30 -0
  69. package/lib/adapters/DslAdapter.js +653 -0
  70. package/lib/adapters/index.js +20 -0
  71. package/lib/config/constants.js +286 -0
  72. package/lib/config/patterns/creditCard.js +9 -0
  73. package/lib/config/patterns/idCard.js +9 -0
  74. package/lib/config/patterns/index.js +8 -0
  75. package/lib/config/patterns/licensePlate.js +4 -0
  76. package/lib/config/patterns/passport.js +4 -0
  77. package/lib/config/patterns/phone.js +9 -0
  78. package/lib/config/patterns/postalCode.js +5 -0
  79. package/lib/core/CacheManager.js +376 -0
  80. package/lib/core/DslBuilder.js +740 -0
  81. package/lib/core/ErrorCodes.js +233 -0
  82. package/lib/core/ErrorFormatter.js +342 -0
  83. package/lib/core/JSONSchemaCore.js +347 -0
  84. package/lib/core/Locale.js +119 -0
  85. package/lib/core/MessageTemplate.js +89 -0
  86. package/lib/core/PluginManager.js +448 -0
  87. package/lib/core/StringExtensions.js +209 -0
  88. package/lib/core/Validator.js +316 -0
  89. package/lib/exporters/MarkdownExporter.js +420 -0
  90. package/lib/exporters/MongoDBExporter.js +162 -0
  91. package/lib/exporters/MySQLExporter.js +212 -0
  92. package/lib/exporters/PostgreSQLExporter.js +289 -0
  93. package/lib/exporters/index.js +24 -0
  94. package/lib/locales/en-US.js +65 -0
  95. package/lib/locales/es-ES.js +66 -0
  96. package/lib/locales/fr-FR.js +66 -0
  97. package/lib/locales/index.js +8 -0
  98. package/lib/locales/ja-JP.js +66 -0
  99. package/lib/locales/zh-CN.js +93 -0
  100. package/lib/utils/LRUCache.js +174 -0
  101. package/lib/utils/SchemaHelper.js +240 -0
  102. package/lib/utils/SchemaUtils.js +313 -0
  103. package/lib/utils/TypeConverter.js +245 -0
  104. package/lib/utils/index.js +13 -0
  105. package/lib/validators/CustomKeywords.js +203 -0
  106. package/lib/validators/index.js +11 -0
  107. package/package.json +70 -0
  108. package/plugins/custom-format.js +101 -0
  109. package/plugins/custom-validator.js +200 -0
@@ -0,0 +1,654 @@
1
+ # DSL 语法完整指南
2
+
3
+ > **更新时间**: 2025-12-25
4
+
5
+ ---
6
+
7
+ ## 📑 目录
8
+
9
+ - [快速开始](#快速开始)
10
+ - [完整类型列表](#完整类型列表)
11
+ - [基础语法](#基础语法)
12
+ - [约束语法](#约束语法)
13
+ - [数组语法](#数组语法)
14
+ - [对象语法](#对象语法)
15
+ - [条件验证 (Match)](#条件验证-match)
16
+ - [高级用法](#高级用法)
17
+ - [实现方案对比](#实现方案对比)
18
+ - [完整示例](#完整示例)
19
+
20
+ ---
21
+
22
+ ## 快速开始
23
+
24
+ ```javascript
25
+ const { dsl } = require('schema-dsl');
26
+
27
+ // 基本类型
28
+ const schema = dsl({
29
+ name: 'string!', // 必填字符串
30
+ age: 'number', // 可选数字
31
+ email: 'email!', // 必填邮箱
32
+ active: 'boolean', // 布尔值
33
+ tags: 'array<string>' // 字符串数组
34
+ });
35
+ ```
36
+
37
+ ---
38
+
39
+ ## 完整类型列表
40
+
41
+ ### 基本类型
42
+
43
+ | 类型 | DSL | 说明 |
44
+ |------|-----|------|
45
+ | 字符串 | `string` | 文本类型 |
46
+ | 数字 | `number` | 浮点数 |
47
+ | 整数 | `integer` | 整数 |
48
+ | 布尔 | `boolean` | true/false |
49
+ | 对象 | `object` | 嵌套对象 |
50
+ | 数组 | `array` | 数组类型 |
51
+ | 空值 | `null` | null值 |
52
+ | 任意 | `any` | 任意类型 |
53
+
54
+ ### 格式类型
55
+
56
+ | 类型 | DSL | 说明 |
57
+ |------|-----|------|
58
+ | 邮箱 | `email` | 邮箱地址 |
59
+ | URL | `url` | 网址 |
60
+ | UUID | `uuid` | UUID格式 |
61
+ | 日期 | `date` | YYYY-MM-DD |
62
+ | 日期时间 | `datetime` | ISO 8601 |
63
+ | 时间 | `time` | HH:mm:ss |
64
+ | IPv4 | `ipv4` | IPv4地址 |
65
+ | IPv6 | `ipv6` | IPv6地址 |
66
+ | 二进制 | `binary` | Base64编码 |
67
+
68
+
69
+ ---
70
+
71
+ ## 基础语法
72
+
73
+ ### 1. 类型定义
74
+
75
+ ```javascript
76
+ // 基本类型
77
+ 'string' // 字符串
78
+ 'number' // 数字
79
+ 'integer' // 整数
80
+ 'boolean' // 布尔
81
+
82
+ // 格式类型
83
+ 'email' // 邮箱
84
+ 'url' // URL
85
+ 'date' // 日期
86
+ 'uuid' // UUID
87
+ ```
88
+
89
+ ### 2. 必填标记
90
+
91
+ 使用 `!` 标记必填字段:
92
+
93
+ ```javascript
94
+ const schema = dsl({
95
+ username: 'string!', // 必填
96
+ nickname: 'string' // 可选
97
+ });
98
+ ```
99
+
100
+ ### 3. 对象必填
101
+
102
+ 支持两种方式:
103
+
104
+ ```javascript
105
+ // 方式1: 字段内部必填
106
+ const schema1 = dsl({
107
+ user: {
108
+ name: 'string!', // name 必填(user 可选)
109
+ email: 'email!' // email 必填
110
+ }
111
+ });
112
+
113
+ // 方式2: 对象本身必填 ✅ 推荐
114
+ const schema2 = dsl({
115
+ 'user!': { // user 本身必填
116
+ name: 'string', // name 可选
117
+ email: 'email' // email 可选
118
+ }
119
+ });
120
+ ```
121
+
122
+ ---
123
+
124
+ ## 约束语法
125
+
126
+ ### 1. 字符串长度
127
+
128
+ ```javascript
129
+ 'string:10' // 最大长度10
130
+ 'string:-10' // 最大长度10(明确语法)
131
+ 'string:3-32' // 长度3-32
132
+ 'string:10-' // 最小长度10
133
+ ```
134
+
135
+ **示例**:
136
+ ```javascript
137
+ const schema = dsl({
138
+ username: 'string:3-32!', // 3-32字符,必填
139
+ bio: 'string:500', // 最大500字符
140
+ password: 'string:8-' // 最少8字符
141
+ });
142
+ ```
143
+
144
+ ### 2. 数字范围
145
+
146
+ ```javascript
147
+ 'number:100' // 最大值100
148
+ 'number:0-100' // 范围0-100
149
+ 'number:18-' // 最小值18
150
+ ```
151
+
152
+ **示例**:
153
+ ```javascript
154
+ const schema = dsl({
155
+ age: 'number:18-120', // 18-120
156
+ score: 'number:100', // 0-100
157
+ price: 'number:0-' // ≥0
158
+ });
159
+ ```
160
+
161
+ ### 3. 枚举值
162
+
163
+ 使用 `|` 分隔枚举值:
164
+
165
+ ```javascript
166
+ const schema = dsl({
167
+ status: 'active|inactive|pending',
168
+ gender: 'male|female|other!',
169
+ role: 'admin|user|guest'
170
+ });
171
+ ```
172
+
173
+ ### 4. 特殊约束
174
+
175
+ 支持特定格式的约束:
176
+
177
+ ```javascript
178
+ 'phone:cn' // 中国手机号
179
+ 'idCard:cn' // 中国身份证
180
+ 'creditCard:visa' // Visa信用卡
181
+ 'licensePlate:cn' // 中国车牌
182
+ 'postalCode:cn' // 中国邮编
183
+ 'passport:cn' // 中国护照
184
+ ```
185
+
186
+ **示例**:
187
+ ```javascript
188
+ const schema = dsl({
189
+ mobile: 'phone:cn!',
190
+ id: 'idCard:cn',
191
+ card: 'creditCard:mastercard'
192
+ });
193
+ ```
194
+
195
+ ---
196
+
197
+ ## 数组语法
198
+
199
+ ### 1. 基础数组
200
+
201
+ ```javascript
202
+ 'array' // 任意类型数组
203
+ 'array<string>' // 字符串数组
204
+ 'array<number>' // 数字数组
205
+ 'array<integer>' // 整数数组
206
+ ```
207
+
208
+ ### 2. 数组长度约束
209
+
210
+ ```javascript
211
+ 'array:1-10' // 1-10个元素
212
+ 'array!1-10' // 1-10个元素,必填
213
+ 'array:1-' // 至少1个元素
214
+ 'array:-10' // 最多10个元素
215
+ 'array:1-10<string>' // 1-10个字符串元素
216
+ ```
217
+
218
+ **示例**:
219
+ ```javascript
220
+ const schema = dsl({
221
+ tags: 'array!1-10<string>', // 必填,1-10个字符串
222
+ scores: 'array:1-5<number>', // 可选,1-5个数字
223
+ items: 'array:1-<string>' // 至少1个字符串
224
+ });
225
+ ```
226
+
227
+ ### 3. 数组元素约束
228
+
229
+ ```javascript
230
+ const schema = dsl({
231
+ tags: 'array<string:1-20>', // 每个字符串1-20字符
232
+ scores: 'array<number:0-100>', // 每个数字0-100
233
+ ids: 'array<integer:1->' // 每个整数≥1
234
+ });
235
+ ```
236
+
237
+ ### 4. 嵌套数组
238
+
239
+ ```javascript
240
+ // 二维数组
241
+ const schema = dsl({
242
+ matrix: 'array<array<number>>'
243
+ });
244
+
245
+ // 对象数组
246
+ const schema = dsl({
247
+ users: 'array<object>',
248
+ // 或更详细定义
249
+ items: {
250
+ type: 'array',
251
+ items: {
252
+ name: 'string!',
253
+ age: 'number'
254
+ }
255
+ }
256
+ });
257
+ ```
258
+
259
+ ---
260
+
261
+ ## 对象语法
262
+
263
+ ### 1. 基础对象
264
+
265
+ ```javascript
266
+ const schema = dsl({
267
+ user: {
268
+ name: 'string!',
269
+ email: 'email!',
270
+ age: 'number'
271
+ }
272
+ });
273
+ ```
274
+
275
+ ### 2. 嵌套对象
276
+
277
+ ```javascript
278
+ const schema = dsl({
279
+ user: {
280
+ profile: {
281
+ bio: 'string:500',
282
+ social: {
283
+ twitter: 'url',
284
+ github: 'url'
285
+ }
286
+ }
287
+ }
288
+ });
289
+ ```
290
+
291
+ ### 3. 混合嵌套
292
+
293
+ ```javascript
294
+ const schema = dsl({
295
+ 'user!': { // user 必填
296
+ name: 'string!', // name 必填
297
+ contacts: 'array!1-5<object>', // 1-5个联系方式
298
+ tags: 'array<string:1-20>' // 字符串数组
299
+ }
300
+ });
301
+ ```
302
+
303
+ ---
304
+
305
+ ## 条件验证 (Match)
306
+
307
+ 支持更优雅的条件验证语法 `dsl.match` 和 `dsl.if`。
308
+
309
+ ### 1. dsl.match (推荐)
310
+
311
+ 类似于 `switch-case`,根据某个字段的值决定当前字段的验证规则。
312
+
313
+ **语法**:
314
+ ```javascript
315
+ dsl.match(field, {
316
+ value1: 'schema1',
317
+ value2: 'schema2',
318
+ _default: 'defaultSchema' // 可选
319
+ })
320
+ ```
321
+
322
+ **示例**:
323
+ ```javascript
324
+ const schema = dsl({
325
+ contactType: 'email|phone',
326
+
327
+ // 根据 contactType 的值决定 contact 的规则
328
+ contact: dsl.match('contactType', {
329
+ email: 'email!', // contactType=email 时
330
+ phone: 'string:11!', // contactType=phone 时
331
+ _default: 'string' // 其他情况
332
+ })
333
+ });
334
+ ```
335
+
336
+ **处理非英文值**:
337
+ 如果条件值包含中文、数字或特殊字符,给键名加上引号即可:
338
+
339
+ ```javascript
340
+ discount: dsl.match('level', {
341
+ '普通用户': 'number:0-5',
342
+ 'VIP-1': 'number:0-20',
343
+ '100': 'number:0-50'
344
+ })
345
+ ```
346
+
347
+ ### 2. dsl.if (简单条件)
348
+
349
+ 适用于简单的二选一场景。
350
+
351
+ **语法**:
352
+ ```javascript
353
+ dsl.if(conditionField, thenSchema, elseSchema)
354
+ ```
355
+
356
+ **示例**:
357
+ ```javascript
358
+ const schema = dsl({
359
+ isVip: 'boolean',
360
+
361
+ // 如果是VIP,折扣0-50,否则0-10
362
+ discount: dsl.if('isVip', 'number:0-50', 'number:0-10')
363
+ });
364
+ ```
365
+
366
+ ---
367
+
368
+ ## 高级用法
369
+
370
+ ### 1. 链式调用
371
+
372
+ ```javascript
373
+ const schema = dsl({
374
+ username: 'string:3-32!'
375
+ .pattern(/^[a-zA-Z0-9_]+$/)
376
+ .label('用户名')
377
+ .messages({
378
+ 'pattern': '只能包含字母、数字和下划线'
379
+ }),
380
+
381
+ email: 'email!'
382
+ .label('邮箱地址')
383
+ .description('用于登录和接收通知')
384
+ .custom(async (value) => {
385
+ const exists = await checkEmailExists(value);
386
+ if (exists) return '邮箱已被占用';
387
+ })
388
+ });
389
+ ```
390
+
391
+ ### 2. 默认验证器
392
+
393
+ ```javascript
394
+ const schema = dsl({
395
+ username: 'string!'.username('5-20'), // 自动正则+长度
396
+ phone: 'string!'.phone('cn'), // 中国手机号
397
+ password: 'string!'.password('strong') // 强密码
398
+ });
399
+ ```
400
+
401
+ ---
402
+
403
+ ## 注意事项
404
+
405
+ ### 1. 条件验证
406
+
407
+ ⚠️ **注意**: DSL 字符串不支持直接写条件逻辑
408
+
409
+ ```javascript
410
+ 'string | number' // ❌ 不支持
411
+ ```
412
+
413
+ **解决方案**: 使用 `dsl.match` (推荐)
414
+
415
+ ```javascript
416
+ // ✅ 推荐:使用 dsl.match
417
+ const schema = dsl({
418
+ vipLevel: 'string',
419
+ discount: dsl.match('vipLevel', {
420
+ gold: 'number:0-50',
421
+ silver: 'number:0-20',
422
+ normal: 'number:0-5'
423
+ })
424
+ });
425
+ ```
426
+
427
+ ---
428
+
429
+ ### 2. 数组约束
430
+
431
+ ✅ **推荐**: 使用简洁的 DSL 语法
432
+ ```javascript
433
+ 'array!1-10<string:1-20>' // 1-10个元素,每个1-20字符
434
+ ```
435
+
436
+ ⚠️ **也可以**: 使用完整 JSON Schema 格式(不推荐,太繁琐)
437
+ ```javascript
438
+ {
439
+ type: 'array',
440
+ items: { type: 'string' },
441
+ minItems: 1,
442
+ maxItems: 10
443
+ }
444
+ ```
445
+
446
+ ---
447
+
448
+ ### 3. 正则验证
449
+
450
+ ⚠️ **注意**: DSL 字符串不支持直接写正则
451
+
452
+ ```javascript
453
+ 'string:/^[a-z]+$/' // ❌ 不支持
454
+ ```
455
+
456
+ **解决方案**: 使用 `.pattern()` 方法
457
+ ```javascript
458
+ 'string!'.pattern(/^[a-z]+$/) // ✅ 推荐
459
+ ```
460
+
461
+ ---
462
+
463
+ ### 4. 自定义验证
464
+
465
+ ⚠️ **注意**: DSL 字符串不支持自定义逻辑
466
+
467
+ ```javascript
468
+ 'string!@custom' // ❌ 不支持
469
+ ```
470
+
471
+ **解决方案**: 使用 `.custom()` 方法
472
+ ```javascript
473
+ 'string!'.custom(async (value) => {
474
+ // 自定义逻辑
475
+ if (await checkExists(value)) {
476
+ return '已存在';
477
+ }
478
+ })
479
+ ```
480
+
481
+ ---
482
+
483
+ ### 5. 对象数组详细定义
484
+
485
+ ⚠️ **注意**: DSL 简写不支持对象数组的详细定义
486
+
487
+ ```javascript
488
+ 'array<object{name:string,age:number}>' // ❌ 不支持
489
+ ```
490
+
491
+ **解决方案**: 使用完整对象定义
492
+ ```javascript
493
+ const schema = dsl({
494
+ users: {
495
+ type: 'array',
496
+ items: {
497
+ name: 'string!',
498
+ age: 'number:18-'
499
+ }
500
+ }
501
+ });
502
+ ```
503
+
504
+ ---
505
+
506
+ ## 完整示例
507
+
508
+ ### 用户注册表单
509
+
510
+ ```javascript
511
+ const { dsl } = require('schema-dsl');
512
+
513
+ const schema = dsl({
514
+ // 基本信息
515
+ username: 'string:3-32!'.username().label('用户名'),
516
+ password: 'string!'.password('strong').label('密码'),
517
+ email: 'email!'.label('邮箱'),
518
+ phone: 'string!'.phone('cn').label('手机号'),
519
+
520
+ // 个人资料
521
+ 'profile!': {
522
+ realName: 'string:2-50',
523
+ gender: 'male|female|other',
524
+ birthday: 'date',
525
+ bio: 'string:500'
526
+ },
527
+
528
+ // 地址信息
529
+ addresses: 'array:1-5<object>', // 1-5个地址
530
+
531
+ // 标签
532
+ tags: 'array:1-10<string:1-20>', // 1-10个标签,每个1-20字符
533
+
534
+ // 同意条款
535
+ agree: 'boolean!'
536
+ });
537
+ ```
538
+
539
+ ### 电商商品 Schema
540
+
541
+ ```javascript
542
+ const schema = dsl({
543
+ // 商品基本信息
544
+ title: 'string:1-100!',
545
+ price: 'number:0-!',
546
+ stock: 'integer:0-',
547
+ status: 'on_sale|off_sale|sold_out!',
548
+
549
+ // 商品详情
550
+ 'details!': {
551
+ description: 'string:10000',
552
+ images: 'array!1-10<url>',
553
+ specs: 'array<object>',
554
+ tags: 'array:1-20<string:1-30>'
555
+ },
556
+
557
+ // SKU信息
558
+ skus: {
559
+ type: 'array',
560
+ minItems: 1,
561
+ items: {
562
+ sku_code: 'string!',
563
+ price: 'number!',
564
+ stock: 'integer!'
565
+ }
566
+ }
567
+ });
568
+ ```
569
+
570
+ ### API 请求验证
571
+
572
+ ```javascript
573
+ const schema = dsl({
574
+ // 查询参数
575
+ page: 'integer:1-',
576
+ pageSize: 'integer:10-100',
577
+ keyword: 'string:1-50',
578
+
579
+ // 筛选条件
580
+ filters: {
581
+ category: 'array<string>',
582
+ priceRange: {
583
+ min: 'number:0-',
584
+ max: 'number:0-'
585
+ },
586
+ status: 'active|inactive'
587
+ },
588
+
589
+ // 排序
590
+ sort: {
591
+ field: 'price|created_at|sales',
592
+ order: 'asc|desc'
593
+ }
594
+ });
595
+ ```
596
+
597
+ ---
598
+
599
+ ## 常见问题
600
+
601
+ ### Q1: 为什么移除了简写功能?
602
+
603
+ **A**: 为了降低学习成本和减少歧义。使用完整类型名更清晰,特别是对新手更友好。
604
+
605
+ ### Q2: 数组长度约束怎么写?
606
+
607
+ **A**: 支持直接在DSL中写:
608
+ ```javascript
609
+ 'array!1-10<string>' // 推荐
610
+ ```
611
+
612
+ ### Q3: 如何定义对象数组?
613
+
614
+ **A**: 使用完整对象定义:
615
+ ```javascript
616
+ const schema = dsl({
617
+ users: {
618
+ type: 'array',
619
+ items: {
620
+ name: 'string!',
621
+ email: 'email!'
622
+ }
623
+ }
624
+ });
625
+ ```
626
+
627
+ ### Q4: 不支持条件验证吗?
628
+
629
+ **A**: 支持。推荐使用 `dsl.match`:
630
+ ```javascript
631
+ dsl.match('vipLevel', { gold: 'number:0-50', silver: 'number:0-20' })
632
+ ```
633
+
634
+ ### Q5: 能用正则验证吗?
635
+
636
+ **A**: 能,使用 `.pattern()` 方法:
637
+ ```javascript
638
+ 'string!'.pattern(/^[a-z]+$/)
639
+ ```
640
+
641
+ ---
642
+
643
+ ## 相关文档
644
+
645
+ - [类型参考](./type-reference.md) - 完整类型列表
646
+ - [String 扩展](./string-extensions.md) - 链式调用
647
+ - [快速开始](./quick-start.md) - 5分钟上手
648
+
649
+ ---
650
+
651
+ **最后更新**: 2025-12-25
652
+ **文档版本**: v2.0.1
653
+ **作者**: SchemaIO Team
654
+