schema-dsl 1.1.7 → 1.1.9

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.
package/CHANGELOG.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # 变更日志 (CHANGELOG)
2
2
 
3
3
  > **说明**: 版本概览摘要,详细变更见 [changelogs/](./changelogs/) 目录
4
- > **最后更新**: 2026-01-27
4
+ > **最后更新**: 2026-01-30
5
5
 
6
6
  ---
7
7
 
@@ -9,6 +9,7 @@
9
9
 
10
10
  | 版本 | 日期 | 变更摘要 | 详细 |
11
11
  |------|------|---------|------|
12
+ | [v1.1.8](./changelogs/v1.1.8.md) | 2026-01-30 | 🚀 新功能:智能参数识别 - 支持简化语法 `dsl.error.throw('key', 'locale')` | [查看](./changelogs/v1.1.8.md) |
12
13
  | [v1.1.7](./changelogs/v1.1.7.md) | 2026-01-27 | 🐛 Bug修复:错误消息路径显示优化 - 所有错误类型的 message 只显示字段名 | [查看](./changelogs/v1.1.7.md) |
13
14
  | [v1.1.6](./changelogs/v1.1.6.md) | 2026-01-23 | 🐛 Bug修复:enum和additionalProperties错误消息模板变量未替换 | [查看](./changelogs/v1.1.6.md) |
14
15
  | [v1.1.5](./changelogs/v1.1.5.md) | 2026-01-17 | 🚀 新功能:错误配置对象格式支持 - 语言包支持 `{ code, message }` 对象格式 | [查看](./changelogs/v1.1.5.md) |
@@ -29,7 +30,7 @@
29
30
  | [v1.0.0](./changelogs/v1.0.0.md) | 2025-12-29 | 初始发布版本 | [查看](./changelogs/v1.0.0.md) |
30
31
 
31
32
  > 💡 **提示**: 重要版本的详细变更记录在 [changelogs/](./changelogs/) 目录中。
32
- > 当前已有详细文档的版本:v1.1.7, v1.1.6, v1.1.5, v1.1.4, v1.1.3, v1.1.2, v1.1.1, v1.1.0, v1.0.9, v1.0.0
33
+ > 当前已有详细文档的版本:v1.1.8, v1.1.7, v1.1.6, v1.1.5, v1.1.4, v1.1.3, v1.1.2, v1.1.1, v1.1.0, v1.0.9, v1.0.0
33
34
  > 其他版本的详细变更信息请参考项目提交历史或联系维护者。
34
35
 
35
36
  ---
@@ -38,30 +39,45 @@
38
39
 
39
40
  | 版本系列 | 版本数 | 主要改进方向 |
40
41
  |---------|-------|------------|
41
- | v1.1.x | 8 | Bug修复、错误消息优化、错误配置增强、TypeScript类型完善、多语言支持、数字运算符、联合类型 |
42
+ | v1.1.x | 9 | 智能参数识别、Bug修复、错误消息优化、错误配置增强、TypeScript类型完善、多语言支持、数字运算符、联合类型 |
42
43
  | v1.0.x | 10 | 核心功能、验证器、测试覆盖、文档完善 |
43
44
 
44
45
  ---
45
46
 
46
47
  ## 里程碑版本
47
48
 
48
- ### v1.1.7 - 错误消息路径显示优化 🐛
49
+ ### v1.1.8 - 智能参数识别 🚀
49
50
 
50
- **发布日期**: 2026-01-27
51
- **重要性**: ⭐⭐⭐⭐
51
+ **发布日期**: 2026-01-30
52
+ **重要性**: ⭐⭐⭐⭐⭐
52
53
 
53
54
  **主要改进**:
54
- - 🐛 修复嵌套对象错误消息显示完整路径的问题(如 `user/profile/age should be number` → `age should be number`)
55
- - ✅ 统一所有错误类型的 label 生成逻辑,message 只显示字段名而非完整路径
56
- - ✅ path 保留完整路径用于定位(符合 JSON Pointer RFC 6901 标准)
57
- - ✅ 修复范围:requiredtypeminLength、maxLength、pattern、format、enum、minimum、maximum、minItems、maxItems、additionalProperties 等所有错误类型
58
- - ✅ 新增 6 个测试用例,测试总数 983 个
55
+ - 🚀 新增智能参数识别功能,支持简化语法 `dsl.error.throw('key', 'locale')`
56
+ - ✅ 从4个参数减少到2个参数(不需要参数对象时)
57
+ - ✅ 智能识别第2个参数类型:字符串→语言参数,对象→参数对象
58
+ - ✅ 所有方法都支持:createthrowassert
59
+ - ✅ 完全向后兼容,现有代码无需修改
60
+ - ✅ 新增 17 个测试用例,100%通过率
59
61
 
60
62
  **技术细节**:
61
- - 修改文件:`lib/core/ErrorFormatter.js`
62
- - 从完整路径中提取最后一级字段名作为 label
63
- - 遵循 JSON Pointer (RFC 6901) 标准使用 `/` 作为路径分隔符
64
- - 测试修复:添加 `beforeEach` 钩子重置语言为英文,避免测试污染
63
+ - 新增 `normalizeParams()` 工具函数
64
+ - 修改文件:`lib/errors/I18nError.js`、`index.js`
65
+ - 参数识别逻辑:typeof 检查 + Array.isArray 排除
66
+ - 零性能损失,运行时开销可忽略不计
67
+
68
+ **使用示例**:
69
+ ```javascript
70
+ // 之前:必须传递空对象
71
+ dsl.error.throw('account.notFound', {}, 404, 'zh-CN');
72
+
73
+ // 现在:直接传语言参数
74
+ dsl.error.throw('account.notFound', 'zh-CN', 404);
75
+ ```
76
+
77
+ ### v1.1.7 - 错误消息路径显示优化 🐛
78
+
79
+ **发布日期**: 2026-01-27
80
+ **重要性**: ⭐⭐⭐⭐
65
81
 
66
82
  ### v1.1.6 - ErrorFormatter Bug修复 🐛
67
83
 
package/README.md CHANGED
@@ -68,7 +68,52 @@ console.log(result.valid); // true
68
68
 
69
69
  ---
70
70
 
71
- ## 🆕 最新特性(v1.1.5
71
+ ## 🆕 最新特性(v1.1.8
72
+
73
+ ### 🎯 智能参数识别 - 简化语法支持(v1.1.8)
74
+
75
+ **API 更简洁,从4个参数减少到2个参数**
76
+
77
+ ```javascript
78
+ const { dsl, Locale } = require('schema-dsl');
79
+
80
+ // 配置语言包
81
+ Locale.addLocale('zh-CN', {
82
+ 'account.notFound': {
83
+ code: 40001,
84
+ message: '账户不存在'
85
+ }
86
+ });
87
+
88
+ Locale.addLocale('en-US', {
89
+ 'account.notFound': {
90
+ code: 40001,
91
+ message: 'Account not found'
92
+ }
93
+ });
94
+
95
+ // ✅ 新增:简化语法(推荐)
96
+ dsl.error.throw('account.notFound', 'zh-CN');
97
+ dsl.error.throw('account.notFound', 'zh-CN', 404);
98
+
99
+ // ✅ 标准语法(完全兼容)
100
+ dsl.error.throw('account.notFound', {}, 404, 'zh-CN');
101
+ dsl.error.throw('account.notFound', { id: '123' }, 404, 'zh-CN');
102
+
103
+ // 所有方法都支持
104
+ dsl.error.create('account.notFound', 'zh-CN');
105
+ dsl.error.assert(account, 'account.notFound', 'zh-CN');
106
+ ```
107
+
108
+ **核心优势**:
109
+ - 🎯 **参数更少**: 无需参数对象时从4个参数减少到2个
110
+ - 🎯 **智能识别**: 自动判断第2个参数是语言还是参数对象
111
+ - 🎯 **完全兼容**: 现有代码无需修改,渐进式增强
112
+ - 🎯 **降低错误**: 不再需要传递空对象 `{}`
113
+
114
+ 📖 [完整文档](./docs/error-handling.md) · [实现原理](./docs/i18n-implementation-analysis.md) · [变更日志](./changelogs/v1.1.8.md)
115
+
116
+ ---
72
117
 
73
118
  ### 🎯 错误配置对象格式支持(v1.1.5)
74
119
 
@@ -0,0 +1,376 @@
1
+ # schema-dsl v1.1.8 变更日志
2
+
3
+ > **发布日期**: 2026-01-30
4
+ > **类型**: 功能增强 🚀
5
+ > **重要性**: ⭐⭐⭐⭐⭐
6
+
7
+ ---
8
+
9
+ ## 📋 本版本概览
10
+
11
+ ### 🎯 核心更新
12
+
13
+ **智能参数识别 - 简化语法支持**
14
+
15
+ 支持简化的错误抛出语法,从4个参数减少到2个参数,使API调用更加简洁直观。
16
+
17
+ ```javascript
18
+ // ✅ 新增:简化语法
19
+ dsl.error.throw('account.notFound', 'zh-CN');
20
+
21
+ // ✅ 保持:标准语法(完全兼容)
22
+ dsl.error.throw('account.notFound', {}, 404, 'zh-CN');
23
+ ```
24
+
25
+ ---
26
+
27
+ ## 🚀 新增功能
28
+
29
+ ### 1. 智能参数识别
30
+
31
+ **问题背景**:原有API需要4个参数,即使不需要参数对象也要传空对象 `{}`
32
+
33
+ ```javascript
34
+ // ❌ 原有方式:必须传递空对象
35
+ dsl.error.throw('account.notFound', {}, 404, 'zh-CN');
36
+ ```
37
+
38
+ **解决方案**:智能识别第2个参数类型,自动判断是语言参数还是参数对象
39
+
40
+ ```javascript
41
+ // ✅ 简化语法:直接传语言
42
+ dsl.error.throw('account.notFound', 'zh-CN');
43
+ dsl.error.throw('account.notFound', 'zh-CN', 404);
44
+
45
+ // ✅ 标准语法:传参数对象(完全兼容)
46
+ dsl.error.throw('account.notFound', { id: '123' }, 404, 'zh-CN');
47
+ ```
48
+
49
+ **识别规则**:
50
+ - 第2个参数是 `string` → 识别为语言参数
51
+ - 第2个参数是 `object` → 识别为参数对象
52
+ - 第2个参数是 `null/undefined/数组` → 使用默认值
53
+
54
+ ### 2. 所有错误方法都支持
55
+
56
+ ```javascript
57
+ // dsl.error.create() - 创建错误
58
+ const error = dsl.error.create('account.notFound', 'zh-CN');
59
+
60
+ // dsl.error.throw() - 抛出错误
61
+ dsl.error.throw('account.notFound', 'zh-CN');
62
+
63
+ // dsl.error.assert() - 断言式错误
64
+ dsl.error.assert(account, 'account.notFound', 'zh-CN');
65
+ dsl.error.assert(account, 'account.notFound', 'zh-CN', 404);
66
+
67
+ // I18nError 直接调用
68
+ I18nError.throw('account.notFound', 'zh-CN');
69
+ I18nError.create('account.notFound', 'zh-CN');
70
+ I18nError.assert(account, 'account.notFound', 'zh-CN');
71
+ ```
72
+
73
+ ---
74
+
75
+ ## 🔧 技术实现
76
+
77
+ ### 新增工具函数
78
+
79
+ ```javascript
80
+ /**
81
+ * 智能参数识别工具函数
82
+ * @private
83
+ */
84
+ function normalizeParams(paramsOrLocale, statusCode, locale) {
85
+ let params = {};
86
+ let actualStatusCode = 400;
87
+ let actualLocale = null;
88
+
89
+ if (typeof paramsOrLocale === 'string') {
90
+ // 字符串 → 语言参数
91
+ actualLocale = paramsOrLocale;
92
+ actualStatusCode = typeof statusCode === 'number' ? statusCode : 400;
93
+ } else if (paramsOrLocale && typeof paramsOrLocale === 'object' && !Array.isArray(paramsOrLocale)) {
94
+ // 对象(非数组)→ 参数对象
95
+ params = paramsOrLocale;
96
+ actualStatusCode = typeof statusCode === 'number' ? statusCode : 400;
97
+ actualLocale = locale;
98
+ } else {
99
+ // null/undefined/数组 → 使用默认值
100
+ actualStatusCode = typeof statusCode === 'number' ? statusCode : 400;
101
+ actualLocale = locale;
102
+ }
103
+
104
+ return { params, statusCode: actualStatusCode, locale: actualLocale };
105
+ }
106
+ ```
107
+
108
+ ### 修改的方法
109
+
110
+ - `I18nError.create()`
111
+ - `I18nError.throw()`
112
+ - `I18nError.assert()`
113
+ - `dsl.error.create()`
114
+ - `dsl.error.throw()`
115
+ - `dsl.error.assert()`
116
+
117
+ ---
118
+
119
+ ## 📖 使用示例
120
+
121
+ ### Express API 示例
122
+
123
+ ```javascript
124
+ const { dsl, Locale } = require('schema-dsl');
125
+
126
+ // 配置语言包
127
+ Locale.addLocale('zh-CN', {
128
+ 'account.notFound': {
129
+ code: 40001,
130
+ message: '账户不存在'
131
+ }
132
+ });
133
+
134
+ Locale.addLocale('en-US', {
135
+ 'account.notFound': {
136
+ code: 40001,
137
+ message: 'Account not found'
138
+ }
139
+ });
140
+
141
+ // API 路由
142
+ app.get('/api/account/:id', async (req, res) => {
143
+ try {
144
+ const account = await findAccount(req.params.id);
145
+ const locale = req.headers['accept-language'] || 'zh-CN';
146
+
147
+ // 🎯 简化语法:只需2个参数
148
+ dsl.error.assert(account, 'account.notFound', locale);
149
+
150
+ res.json(account);
151
+ } catch (error) {
152
+ res.status(error.statusCode).json(error.toJSON());
153
+ }
154
+ });
155
+ ```
156
+
157
+ ### 对比示例
158
+
159
+ ```javascript
160
+ // 之前:4个参数
161
+ dsl.error.throw('account.notFound', {}, 404, 'zh-CN');
162
+ dsl.error.assert(account, 'account.notFound', {}, 404, 'zh-CN');
163
+
164
+ // 现在:2个参数(无需参数对象时)
165
+ dsl.error.throw('account.notFound', 'zh-CN', 404);
166
+ dsl.error.assert(account, 'account.notFound', 'zh-CN', 404);
167
+
168
+ // 或者:3个参数(带参数对象)
169
+ dsl.error.throw('account.insufficientBalance',
170
+ { balance: 50, required: 100 },
171
+ 'zh-CN'
172
+ );
173
+ ```
174
+
175
+ ---
176
+
177
+ ## ✅ 向后兼容性
178
+
179
+ ### 完全向后兼容
180
+
181
+ 所有原有调用方式都完全正常工作,无需修改任何现有代码。
182
+
183
+ | 原有调用方式 | 兼容性 | 说明 |
184
+ |-------------|--------|------|
185
+ | `throw('key')` | ✅ 完全兼容 | 使用全局语言 |
186
+ | `throw('key', {})` | ✅ 完全兼容 | 空参数对象 |
187
+ | `throw('key', {}, 404)` | ✅ 完全兼容 | 带状态码 |
188
+ | `throw('key', {}, 404, 'zh')` | ✅ 完全兼容 | 完整4参数 |
189
+ | `throw('key', {params}, 404, 'zh')` | ✅ 完全兼容 | 带参数对象 |
190
+ | `throw('key', null, 404, 'zh')` | ✅ 完全兼容 | null 参数 |
191
+
192
+ ### 测试验证
193
+
194
+ - **17个测试用例**,全部通过
195
+ - **零破坏性变更**
196
+ - **100%向后兼容**
197
+
198
+ ---
199
+
200
+ ## 🎨 优势
201
+
202
+ ### 1. 用户体验提升
203
+
204
+ - **参数减少**:从4个参数减少到2个(不需要参数对象时)
205
+ - **语法简洁**:`throw('key', 'locale')` 更直观
206
+ - **易于理解**:参数含义更清晰
207
+
208
+ ### 2. 减少错误
209
+
210
+ - **避免混淆**:不再需要传递空对象 `{}`
211
+ - **类型安全**:智能识别参数类型
212
+ - **降低学习成本**:新手更容易上手
213
+
214
+ ### 3. 保持兼容
215
+
216
+ - **渐进式增强**:新旧语法并存
217
+ - **零风险升级**:现有代码无需修改
218
+ - **平滑过渡**:可以逐步迁移到简化语法
219
+
220
+ ---
221
+
222
+ ## 📊 性能影响
223
+
224
+ **无性能损失**
225
+
226
+ - 参数识别逻辑简单(类型检查)
227
+ - 运行时开销可忽略不计
228
+ - 不影响错误抛出性能
229
+
230
+ ---
231
+
232
+ ## 📦 修改文件清单
233
+
234
+ ### 核心文件
235
+
236
+ 1. **lib/errors/I18nError.js**
237
+ - 新增 `normalizeParams()` 工具函数
238
+ - 修改 `create()` 方法
239
+ - 修改 `throw()` 方法
240
+ - 修改 `assert()` 方法
241
+
242
+ 2. **index.js**
243
+ - 更新 `dsl.error` 的 JSDoc 文档
244
+
245
+ ### 文档文件
246
+
247
+ 3. **README.md**
248
+ - 添加简化语法示例
249
+
250
+ 4. **CHANGELOG.md**
251
+ - 添加 v1.1.8 版本信息
252
+
253
+ 5. **changelogs/v1.1.8.md**
254
+ - 详细变更文档(本文件)
255
+
256
+ 6. **docs/error-handling.md**
257
+ - 更新错误处理指南
258
+
259
+ 7. **docs/runtime-locale-support.md**
260
+ - 更新运行时语言文档
261
+
262
+ ---
263
+
264
+ ## 🔗 相关文档
265
+
266
+ - [错误处理完整指南](../docs/error-handling.md)
267
+ - [运行时多语言支持](../docs/runtime-locale-support.md)
268
+ - [API 参考文档](../docs/api-reference.md)
269
+ - [实现原理分析](../docs/i18n-implementation-analysis.md)
270
+ - [兼容性分析](../docs/api-compatibility-analysis.md)
271
+
272
+ ---
273
+
274
+ ## 📝 升级指南
275
+
276
+ ### 如何升级
277
+
278
+ ```bash
279
+ npm install schema-dsl@1.1.8
280
+ # 或
281
+ yarn add schema-dsl@1.1.8
282
+ ```
283
+
284
+ ### 是否需要修改代码?
285
+
286
+ **不需要!** 本版本完全向后兼容,现有代码无需任何修改。
287
+
288
+ ### 推荐的迁移方式
289
+
290
+ 可以逐步将代码迁移到简化语法:
291
+
292
+ ```javascript
293
+ // 旧代码(继续有效)
294
+ dsl.error.throw('account.notFound', {}, 404, 'zh-CN');
295
+
296
+ // 新代码(推荐)
297
+ dsl.error.throw('account.notFound', 'zh-CN', 404);
298
+ ```
299
+
300
+ ---
301
+
302
+ ## 🧪 测试覆盖
303
+
304
+ ### 测试用例
305
+
306
+ 创建了完整的测试套件 `test-smart-params.js`,包含17个测试用例:
307
+
308
+ 1. ✅ 简化语法 - 中文
309
+ 2. ✅ 简化语法 - 英文 + 404
310
+ 3. ✅ 标准语法 - 4参数
311
+ 4. ✅ 标准语法 - 带参数对象
312
+ 5. ✅ 省略所有参数 - 使用全局语言
313
+ 6. ✅ create() 方法 - 简化语法
314
+ 7. ✅ create() 方法 - 带状态码
315
+ 8. ✅ assert() 方法 - 简化语法
316
+ 9. ✅ assert() 方法 - 不应该抛错
317
+ 10. ✅ assert() 方法 - 带状态码
318
+ 11. ✅ assert() 方法 - 带参数对象
319
+ 12. ✅ 边缘情况 - null 参数
320
+ 13. ✅ 边缘情况 - undefined 参数
321
+ 14. ✅ 边缘情况 - 数组参数
322
+ 15. ✅ I18nError.throw() 直接调用
323
+ 16. ✅ I18nError.create() 直接调用
324
+ 17. ✅ I18nError.assert() 直接调用
325
+
326
+ ### 测试结果
327
+
328
+ ```
329
+ 📊 测试结果总结:
330
+ ✅ 通过: 17 个测试
331
+ ❌ 失败: 0 个测试
332
+ 📈 通过率: 100.0%
333
+
334
+ 🎉 所有测试都通过了!智能参数识别功能完全正常!
335
+ ```
336
+
337
+ ---
338
+
339
+ ## 🐛 已知问题
340
+
341
+ 无已知问题。
342
+
343
+ ---
344
+
345
+ ## 🎯 下一步计划
346
+
347
+ - 更新所有文档示例
348
+ - 添加更多使用场景
349
+ - 完善 TypeScript 类型定义
350
+
351
+ ---
352
+
353
+ ## 👥 贡献者
354
+
355
+ 感谢以下贡献者对本版本的贡献:
356
+
357
+ - AI Assistant - 功能设计与实现
358
+
359
+ ---
360
+
361
+ ## 📢 致谢
362
+
363
+ 感谢社区用户的反馈和建议,帮助我们不断改进 API 设计!
364
+
365
+ ---
366
+
367
+ **发布日期**: 2026-01-30
368
+ **版本**: v1.1.8
369
+ **上一版本**: v1.1.7 (错误消息路径显示优化)
370
+ **下一版本预告**: 计划改进文档和示例代码
371
+
372
+ ---
373
+
374
+ **完整变更日志**: [CHANGELOG.md](../CHANGELOG.md)
375
+ **GitHub**: [https://github.com/vextjs/schema-dsl](https://github.com/vextjs/schema-dsl)
376
+ **npm**: [https://www.npmjs.com/package/schema-dsl](https://www.npmjs.com/package/schema-dsl)
@@ -1,7 +1,7 @@
1
1
  # schema-dsl 错误处理完整指南
2
2
 
3
-
4
- > **更新**: 2025-12-25
3
+ > **更新**: 2026-01-30
4
+ > **版本**: v1.1.8+
5
5
  > **适用**: 企业级应用开发
6
6
 
7
7
  ---
@@ -9,13 +9,105 @@
9
9
  ## 📋 目录
10
10
 
11
11
  1. [错误对象结构](#错误对象结构)
12
- 2. [错误消息定制](#错误消息定制)
13
- 3. [错误码系统](#错误码系统)
14
- 4. [多层级错误处理](#多层级错误处理)
15
- 5. [API响应设计](#api响应设计)
16
- 6. [前端错误展示](#前端错误展示)
17
- 7. [错误日志记录](#错误日志记录)
18
- 8. [最佳实践](#最佳实践)
12
+ 2. [I18nError - 多语言错误抛出](#i18nerror---多语言错误抛出) 🆕
13
+ - [智能参数识别(v1.1.8)](#智能参数识别v118)
14
+ - [简化语法](#简化语法)
15
+ - [所有调用方式](#所有调用方式)
16
+ 3. [错误消息定制](#错误消息定制)
17
+ 4. [错误码系统](#错误码系统)
18
+ 5. [多层级错误处理](#多层级错误处理)
19
+ 6. [API响应设计](#api响应设计)
20
+ 7. [前端错误展示](#前端错误展示)
21
+ 8. [错误日志记录](#错误日志记录)
22
+ 9. [最佳实践](#最佳实践)
23
+
24
+ ---
25
+
26
+ ## I18nError - 多语言错误抛出
27
+
28
+ ### 智能参数识别(v1.1.8)
29
+
30
+ **v1.1.8 新增**:支持简化语法,智能识别第2个参数类型
31
+
32
+ #### 简化语法
33
+
34
+ ```javascript
35
+ const { dsl, Locale } = require('schema-dsl');
36
+
37
+ // 配置语言包
38
+ Locale.addLocale('zh-CN', {
39
+ 'account.notFound': {
40
+ code: 40001,
41
+ message: '账户不存在'
42
+ }
43
+ });
44
+
45
+ Locale.addLocale('en-US', {
46
+ 'account.notFound': {
47
+ code: 40001,
48
+ message: 'Account not found'
49
+ }
50
+ });
51
+
52
+ // ✅ 新增:简化语法(推荐)
53
+ dsl.error.throw('account.notFound', 'zh-CN');
54
+ dsl.error.throw('account.notFound', 'zh-CN', 404);
55
+
56
+ // ✅ 标准语法(完全兼容)
57
+ dsl.error.throw('account.notFound', {}, 404, 'zh-CN');
58
+ dsl.error.throw('account.notFound', { id: '123' }, 404, 'zh-CN');
59
+ ```
60
+
61
+ #### 智能识别规则
62
+
63
+ ```javascript
64
+ // 规则:自动判断第2个参数类型
65
+ typeof params === 'string' → 识别为语言参数
66
+ typeof params === 'object' → 识别为参数对象
67
+ params === null/undefined → 使用默认值
68
+ ```
69
+
70
+ #### 所有调用方式
71
+
72
+ ```javascript
73
+ // 1. 简化语法 - 只传语言
74
+ dsl.error.throw('account.notFound', 'zh-CN');
75
+ dsl.error.create('account.notFound', 'en-US');
76
+ dsl.error.assert(account, 'account.notFound', 'zh-CN');
77
+
78
+ // 2. 简化语法 - 语言 + 状态码
79
+ dsl.error.throw('account.notFound', 'zh-CN', 404);
80
+ dsl.error.assert(account, 'account.notFound', 'zh-CN', 404);
81
+
82
+ // 3. 标准语法 - 带参数对象
83
+ dsl.error.throw('account.insufficientBalance',
84
+ { balance: 50, required: 100 },
85
+ 400,
86
+ 'zh-CN'
87
+ );
88
+
89
+ // 4. 省略所有参数 - 使用全局语言
90
+ dsl.error.throw('account.notFound');
91
+ ```
92
+
93
+ #### 实际应用
94
+
95
+ ```javascript
96
+ // Express API
97
+ app.get('/api/account/:id', async (req, res) => {
98
+ try {
99
+ const account = await findAccount(req.params.id);
100
+ const locale = req.headers['accept-language'] || 'zh-CN';
101
+
102
+ // 🎯 简化语法:只需2个参数
103
+ dsl.error.assert(account, 'account.notFound', locale);
104
+
105
+ res.json(account);
106
+ } catch (error) {
107
+ res.status(error.statusCode).json(error.toJSON());
108
+ }
109
+ });
110
+ ```
19
111
 
20
112
  ---
21
113