schema-dsl 1.0.5 → 1.0.6
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 +76 -0
- package/README.md +8 -5
- package/docs/typescript-guide.md +29 -9
- package/index.d.ts +42 -250
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -11,6 +11,9 @@
|
|
|
11
11
|
|
|
12
12
|
| 版本 | 日期 | 变更摘要 | 详细 |
|
|
13
13
|
|------|------|---------|------|
|
|
14
|
+
| [v1.0.6](#v106) | 2026-01-04 | 🚨 紧急修复:TypeScript 类型污染 | [查看详情](#v106) |
|
|
15
|
+
| [v1.0.5](#v105) | 2026-01-04 | 测试覆盖率提升至 97% | [查看详情](#v105) |
|
|
16
|
+
| [v1.0.5](#v105) | 2026-01-04 | 测试覆盖率提升至 97% | [查看详情](#v105) |
|
|
14
17
|
| [v1.0.4](#v104) | 2025-12-31 | TypeScript 完整支持、validateAsync、ValidationError | [查看详情](#v104) |
|
|
15
18
|
| [v1.0.3](#v103) | 2025-12-31 | ⚠️ 破坏性变更:单值语法修复 | [查看详情](#v103) |
|
|
16
19
|
| [v1.0.2](#v102) | 2025-12-31 | 15个新增验证器、完整文档、75个测试 | [查看详情](#v102) |
|
|
@@ -19,6 +22,79 @@
|
|
|
19
22
|
|
|
20
23
|
---
|
|
21
24
|
|
|
25
|
+
## [v1.0.6] - 2026-01-04
|
|
26
|
+
|
|
27
|
+
### 🚨 Fixed (紧急修复)
|
|
28
|
+
|
|
29
|
+
#### TypeScript 类型污染问题 ⭐⭐⭐
|
|
30
|
+
|
|
31
|
+
**问题描述**:
|
|
32
|
+
- v1.0.5 及更早版本中,`index.d.ts` 包含了全局 `interface String` 扩展(第 816-1065 行,共 209 行代码)
|
|
33
|
+
- 这导致 TypeScript 全局类型系统污染,原生 `String.prototype` 方法的类型被错误推断
|
|
34
|
+
- **严重问题**:`String.prototype.trim()` 返回类型从 `string` 被错误推断为 `DslBuilder`
|
|
35
|
+
- 影响所有使用 TypeScript 的项目,导致类型安全问题
|
|
36
|
+
|
|
37
|
+
**修复内容**:
|
|
38
|
+
- ✅ **完全删除**全局 `interface String` 扩展(移除 209 行类型污染代码)
|
|
39
|
+
- ✅ 添加详细的 TypeScript 使用说明文档
|
|
40
|
+
- ✅ 保证原生 String 方法的类型推断正确(`trim()` 正确返回 `string`)
|
|
41
|
+
|
|
42
|
+
**对用户的影响**:
|
|
43
|
+
|
|
44
|
+
1. **JavaScript 用户** ✅ **完全不受影响**
|
|
45
|
+
```javascript
|
|
46
|
+
// 仍然可以正常使用 String 扩展
|
|
47
|
+
const schema = dsl({ email: 'email!'.label('邮箱') });
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
2. **TypeScript 用户** ⚠️ **需要调整用法**
|
|
51
|
+
```typescript
|
|
52
|
+
// ❌ v1.0.5 及之前(有类型污染 bug)
|
|
53
|
+
const schema = dsl({ email: 'email!'.label('邮箱') });
|
|
54
|
+
|
|
55
|
+
// ✅ v1.0.6 推荐写法(获得正确类型提示)
|
|
56
|
+
const schema = dsl({
|
|
57
|
+
email: dsl('email!').label('邮箱')
|
|
58
|
+
});
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**技术细节**:
|
|
62
|
+
- 文件变化:`index.d.ts` 从 2958 行减少到 2749 行
|
|
63
|
+
- 测试状态:所有 677 个测试通过 ✅
|
|
64
|
+
- 类型验证:原生 `String.prototype.trim()` 现在正确返回 `string` 类型
|
|
65
|
+
|
|
66
|
+
**迁移指南**:
|
|
67
|
+
- JavaScript 项目:无需任何修改
|
|
68
|
+
- TypeScript 项目:使用 `dsl()` 函数包裹字符串字面量获得类型提示
|
|
69
|
+
- 详见:[TypeScript 使用指南](./docs/typescript-guide.md)
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## [v1.0.5] - 2026-01-04
|
|
74
|
+
|
|
75
|
+
### Added (新增功能)
|
|
76
|
+
|
|
77
|
+
#### 测试覆盖率大幅提升 ⭐
|
|
78
|
+
|
|
79
|
+
- ✅ **新增 5 个核心类的完整测试**
|
|
80
|
+
- `CacheManager.test.js` - 24 个测试(缓存管理)
|
|
81
|
+
- `ErrorFormatter.test.js` - 9 个测试(错误格式化)
|
|
82
|
+
- `JSONSchemaCore.test.js` - 10 个测试(JSON Schema 核心)
|
|
83
|
+
- `MarkdownExporter.test.js` - 3 个测试(Markdown 导出)
|
|
84
|
+
- `ErrorCodes.test.js` - 4 个测试(错误代码)
|
|
85
|
+
|
|
86
|
+
- ✅ **测试统计**
|
|
87
|
+
- 总测试数:651 → 677(+26 个测试)
|
|
88
|
+
- 测试覆盖率:92% → 97%(+5%)
|
|
89
|
+
- 所有核心类现在都有完整测试覆盖
|
|
90
|
+
|
|
91
|
+
### Fixed (修复)
|
|
92
|
+
|
|
93
|
+
- ✅ 修复缓存配置支持(4 个参数完整支持)
|
|
94
|
+
- ✅ 简化 i18n 配置(从 3 个方法简化为 2 个)
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
22
98
|
## [v1.0.4] - 2025-12-31
|
|
23
99
|
|
|
24
100
|
### Added (新增功能)
|
package/README.md
CHANGED
|
@@ -220,12 +220,12 @@ console.log(result2.errors); // 错误列表
|
|
|
220
220
|
|
|
221
221
|
### 1.5 TypeScript 用法 ⭐
|
|
222
222
|
|
|
223
|
-
**重要**: TypeScript
|
|
223
|
+
**重要**: TypeScript 中**必须**使用 `dsl()` 包裹字符串以获得类型提示(v1.0.6+ 移除了全局 String 类型扩展以避免类型污染):
|
|
224
224
|
|
|
225
225
|
```typescript
|
|
226
226
|
import { dsl, validateAsync, ValidationError } from 'schema-dsl';
|
|
227
227
|
|
|
228
|
-
// ✅
|
|
228
|
+
// ✅ 正确:使用 dsl() 包裹字符串获得完整类型提示
|
|
229
229
|
const userSchema = dsl({
|
|
230
230
|
username: dsl('string:3-32!')
|
|
231
231
|
.pattern(/^[a-zA-Z0-9_]+$/, '只能包含字母、数字和下划线')
|
|
@@ -256,10 +256,13 @@ try {
|
|
|
256
256
|
}
|
|
257
257
|
```
|
|
258
258
|
|
|
259
|
-
|
|
259
|
+
**为什么必须用 `dsl()` 包裹?**
|
|
260
260
|
- ✅ 完整的类型推导和 IDE 自动提示
|
|
261
|
-
- ✅
|
|
262
|
-
- ✅
|
|
261
|
+
- ✅ 避免污染原生 String 类型(v1.0.6+ 重要改进)
|
|
262
|
+
- ✅ 保证 `trim()`、`toLowerCase()` 等原生方法类型正确
|
|
263
|
+
- ✅ 更好的开发体验和类型安全
|
|
264
|
+
|
|
265
|
+
**JavaScript 用户不受影响**:在 JavaScript 中仍然可以直接使用 `'email!'.label('邮箱')` 语法。
|
|
263
266
|
|
|
264
267
|
**详细说明**: 请查看 [TypeScript 使用指南](./docs/typescript-guide.md)
|
|
265
268
|
|
package/docs/typescript-guide.md
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# TypeScript 使用指南
|
|
2
2
|
|
|
3
|
-
> **版本**: schema-dsl v1.0.
|
|
4
|
-
> **更新日期**:
|
|
3
|
+
> **版本**: schema-dsl v1.0.6+
|
|
4
|
+
> **更新日期**: 2026-01-04
|
|
5
|
+
> **重要**: v1.0.6 移除了全局 String 类型扩展以避免类型污染
|
|
5
6
|
|
|
6
7
|
---
|
|
7
8
|
|
|
@@ -53,28 +54,47 @@ if (result.valid) {
|
|
|
53
54
|
|
|
54
55
|
## 2. TypeScript 中的链式调用
|
|
55
56
|
|
|
56
|
-
### 2.1
|
|
57
|
+
### 2.1 重要变更(v1.0.6)
|
|
57
58
|
|
|
58
|
-
|
|
59
|
+
**v1.0.6 移除了全局 `interface String` 扩展**,原因:
|
|
60
|
+
- ❌ 全局类型扩展会污染原生 String 类型
|
|
61
|
+
- ❌ 导致 `trim()`、`toLowerCase()` 等原生方法的类型推断错误
|
|
62
|
+
- ❌ 影响所有使用 TypeScript 的项目的类型安全
|
|
63
|
+
|
|
64
|
+
**结果**:在 TypeScript 中直接对字符串链式调用会报类型错误:
|
|
59
65
|
|
|
60
66
|
```typescript
|
|
61
|
-
// ❌ TypeScript
|
|
67
|
+
// ❌ TypeScript 中会报错(v1.0.6+)
|
|
68
|
+
const schema = dsl({
|
|
69
|
+
email: 'email!'.label('邮箱') // 类型错误:Property 'label' does not exist on type 'string'
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// ✅ JavaScript 中仍然可以正常使用
|
|
62
73
|
const schema = dsl({
|
|
63
|
-
email: 'email!'.label('邮箱') //
|
|
74
|
+
email: 'email!'.label('邮箱') // 运行时完全正常
|
|
64
75
|
});
|
|
65
76
|
```
|
|
66
77
|
|
|
67
|
-
### 2.2
|
|
78
|
+
### 2.2 正确用法 ⭐⭐⭐
|
|
68
79
|
|
|
69
|
-
|
|
80
|
+
**TypeScript 中必须使用 `dsl()` 函数包裹字符串**,才能获得类型提示和链式调用:
|
|
70
81
|
|
|
71
82
|
```typescript
|
|
72
|
-
// ✅
|
|
83
|
+
// ✅ 正确:使用 dsl() 包裹(v1.0.6+ 必须)
|
|
73
84
|
const schema = dsl({
|
|
74
85
|
email: dsl('email!').label('邮箱').pattern(/custom/)
|
|
75
86
|
});
|
|
87
|
+
|
|
88
|
+
// ✅ 也可以先定义再使用
|
|
89
|
+
const emailField = dsl('email!').label('邮箱');
|
|
90
|
+
const schema = dsl({ email: emailField });
|
|
76
91
|
```
|
|
77
92
|
|
|
93
|
+
**好处**:
|
|
94
|
+
- ✅ 获得完整的类型推导和 IDE 自动提示
|
|
95
|
+
- ✅ 不污染原生 String 类型(`trim()` 正确返回 `string`)
|
|
96
|
+
- ✅ 更好的类型安全和开发体验
|
|
97
|
+
|
|
78
98
|
### 2.3 工作原理
|
|
79
99
|
|
|
80
100
|
```typescript
|
package/index.d.ts
CHANGED
|
@@ -814,256 +814,47 @@ declare module 'schema-dsl' {
|
|
|
814
814
|
* });
|
|
815
815
|
* ```
|
|
816
816
|
*/
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
*/
|
|
859
|
-
default(value: any): DslBuilder;
|
|
860
|
-
|
|
861
|
-
/**
|
|
862
|
-
* 转为 JSON Schema
|
|
863
|
-
* @deprecated TypeScript 用户请使用 dsl(string).toSchema()
|
|
864
|
-
*/
|
|
865
|
-
toSchema(): JSONSchema;
|
|
866
|
-
|
|
867
|
-
/**
|
|
868
|
-
* 用户名验证
|
|
869
|
-
* @deprecated TypeScript 用户请使用 dsl(string).username()
|
|
870
|
-
*/
|
|
871
|
-
username(preset?: 'short' | 'medium' | 'long' | string): DslBuilder;
|
|
872
|
-
|
|
873
|
-
/**
|
|
874
|
-
* 密码强度验证
|
|
875
|
-
* @deprecated TypeScript 用户请使用 dsl(string).password()
|
|
876
|
-
*/
|
|
877
|
-
password(strength?: 'weak' | 'medium' | 'strong' | 'veryStrong'): DslBuilder;
|
|
878
|
-
|
|
879
|
-
/**
|
|
880
|
-
* 手机号验证
|
|
881
|
-
* @deprecated TypeScript 用户请使用 dsl(string).phone()
|
|
882
|
-
*/
|
|
883
|
-
phone(country?: 'cn' | 'us' | 'uk' | 'hk' | 'tw' | 'international'): DslBuilder;
|
|
884
|
-
|
|
885
|
-
/**
|
|
886
|
-
* 设置格式
|
|
887
|
-
* @deprecated TypeScript 用户请使用 dsl(string).format()
|
|
888
|
-
*/
|
|
889
|
-
format(format: string): DslBuilder;
|
|
890
|
-
|
|
891
|
-
/**
|
|
892
|
-
* 手机号别名
|
|
893
|
-
* @deprecated TypeScript 用户请使用 dsl(string).phoneNumber()
|
|
894
|
-
*/
|
|
895
|
-
phoneNumber(country?: 'cn' | 'us' | 'uk' | 'hk' | 'tw' | 'international'): DslBuilder;
|
|
896
|
-
|
|
897
|
-
/**
|
|
898
|
-
* 身份证验证
|
|
899
|
-
* @deprecated TypeScript 用户请使用 dsl(string).idCard()
|
|
900
|
-
*/
|
|
901
|
-
idCard(country?: 'cn'): DslBuilder;
|
|
902
|
-
|
|
903
|
-
/**
|
|
904
|
-
* 信用卡验证
|
|
905
|
-
* @deprecated TypeScript 用户请使用 dsl(string).creditCard()
|
|
906
|
-
*/
|
|
907
|
-
creditCard(type?: 'visa' | 'mastercard' | 'amex' | 'discover' | 'jcb' | 'unionpay'): DslBuilder;
|
|
908
|
-
|
|
909
|
-
/**
|
|
910
|
-
* 车牌号验证
|
|
911
|
-
* @deprecated TypeScript 用户请使用 dsl(string).licensePlate()
|
|
912
|
-
*/
|
|
913
|
-
licensePlate(country?: 'cn' | 'us' | 'uk'): DslBuilder;
|
|
914
|
-
|
|
915
|
-
/**
|
|
916
|
-
* 邮政编码验证
|
|
917
|
-
* @deprecated TypeScript 用户请使用 dsl(string).postalCode()
|
|
918
|
-
*/
|
|
919
|
-
postalCode(country?: 'cn' | 'us' | 'uk'): DslBuilder;
|
|
920
|
-
|
|
921
|
-
/**
|
|
922
|
-
* 护照号码验证
|
|
923
|
-
* @deprecated TypeScript 用户请使用 dsl(string).passport()
|
|
924
|
-
*/
|
|
925
|
-
passport(country?: 'cn' | 'us' | 'uk'): DslBuilder;
|
|
926
|
-
|
|
927
|
-
/**
|
|
928
|
-
* String 最小长度
|
|
929
|
-
* @deprecated TypeScript 用户请使用 dsl(string).min()
|
|
930
|
-
*/
|
|
931
|
-
min(n: number): DslBuilder;
|
|
932
|
-
|
|
933
|
-
/**
|
|
934
|
-
* String 最大长度
|
|
935
|
-
* @deprecated TypeScript 用户请使用 dsl(string).max()
|
|
936
|
-
*/
|
|
937
|
-
max(n: number): DslBuilder;
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
/**
|
|
941
|
-
* String 只能包含字母和数字
|
|
942
|
-
* @deprecated TypeScript 用户请使用 dsl(string).alphanum()
|
|
943
|
-
*/
|
|
944
|
-
alphanum(): DslBuilder;
|
|
945
|
-
|
|
946
|
-
/**
|
|
947
|
-
* String 不能包含前后空格
|
|
948
|
-
* @deprecated TypeScript 用户请使用 dsl(string).trim()
|
|
949
|
-
*/
|
|
950
|
-
trim(): DslBuilder;
|
|
951
|
-
|
|
952
|
-
/**
|
|
953
|
-
* String 必须是小写
|
|
954
|
-
* @deprecated TypeScript 用户请使用 dsl(string).lowercase()
|
|
955
|
-
*/
|
|
956
|
-
lowercase(): DslBuilder;
|
|
957
|
-
|
|
958
|
-
/**
|
|
959
|
-
* String 必须是大写
|
|
960
|
-
* @deprecated TypeScript 用户请使用 dsl(string).uppercase()
|
|
961
|
-
*/
|
|
962
|
-
uppercase(): DslBuilder;
|
|
963
|
-
|
|
964
|
-
/**
|
|
965
|
-
* Number 小数位数限制
|
|
966
|
-
* @deprecated TypeScript 用户请使用 dsl(string).precision()
|
|
967
|
-
*/
|
|
968
|
-
precision(n: number): DslBuilder;
|
|
969
|
-
|
|
970
|
-
/**
|
|
971
|
-
* Number 倍数验证
|
|
972
|
-
* @deprecated TypeScript 用户请使用 dsl(string).multiple()
|
|
973
|
-
*/
|
|
974
|
-
multiple(n: number): DslBuilder;
|
|
975
|
-
|
|
976
|
-
/**
|
|
977
|
-
* Number 端口号验证
|
|
978
|
-
* @deprecated TypeScript 用户请使用 dsl(string).port()
|
|
979
|
-
*/
|
|
980
|
-
port(): DslBuilder;
|
|
981
|
-
|
|
982
|
-
/**
|
|
983
|
-
* Object 要求所有属性都必须存在
|
|
984
|
-
* @deprecated TypeScript 用户请使用 dsl(obj).requireAll()
|
|
985
|
-
*/
|
|
986
|
-
requireAll(): DslBuilder;
|
|
987
|
-
|
|
988
|
-
/**
|
|
989
|
-
* Object 严格模式
|
|
990
|
-
* @deprecated TypeScript 用户请使用 dsl(obj).strict()
|
|
991
|
-
*/
|
|
992
|
-
strict(): DslBuilder;
|
|
993
|
-
|
|
994
|
-
/**
|
|
995
|
-
* Array 不允许稀疏数组
|
|
996
|
-
* @deprecated TypeScript 用户请使用 dsl(string).noSparse()
|
|
997
|
-
*/
|
|
998
|
-
noSparse(): DslBuilder;
|
|
999
|
-
|
|
1000
|
-
/**
|
|
1001
|
-
* Array 必须包含指定元素
|
|
1002
|
-
* @deprecated TypeScript 用户请使用 dsl(string).includesRequired()
|
|
1003
|
-
*/
|
|
1004
|
-
includesRequired(items: any[]): DslBuilder;
|
|
1005
|
-
|
|
1006
|
-
/**
|
|
1007
|
-
* Date 自定义日期格式验证
|
|
1008
|
-
* @deprecated TypeScript 用户请使用 dsl(string).dateFormat()
|
|
1009
|
-
*/
|
|
1010
|
-
dateFormat(fmt: string): DslBuilder;
|
|
1011
|
-
|
|
1012
|
-
/**
|
|
1013
|
-
* Date 必须晚于指定日期
|
|
1014
|
-
* @deprecated TypeScript 用户请使用 dsl(string).after()
|
|
1015
|
-
*/
|
|
1016
|
-
after(date: string): DslBuilder;
|
|
1017
|
-
|
|
1018
|
-
/**
|
|
1019
|
-
* Date 必须早于指定日期
|
|
1020
|
-
* @deprecated TypeScript 用户请使用 dsl(string).before()
|
|
1021
|
-
*/
|
|
1022
|
-
before(date: string): DslBuilder;
|
|
1023
|
-
|
|
1024
|
-
/**
|
|
1025
|
-
* Pattern 域名验证
|
|
1026
|
-
* @deprecated TypeScript 用户请使用 dsl(string).domain()
|
|
1027
|
-
*/
|
|
1028
|
-
domain(): DslBuilder;
|
|
1029
|
-
|
|
1030
|
-
/**
|
|
1031
|
-
* Pattern IP地址验证
|
|
1032
|
-
* @deprecated TypeScript 用户请使用 dsl(string).ip()
|
|
1033
|
-
*/
|
|
1034
|
-
ip(): DslBuilder;
|
|
1035
|
-
|
|
1036
|
-
/**
|
|
1037
|
-
* Pattern Base64编码验证
|
|
1038
|
-
* @deprecated TypeScript 用户请使用 dsl(string).base64()
|
|
1039
|
-
*/
|
|
1040
|
-
base64(): DslBuilder;
|
|
1041
|
-
|
|
1042
|
-
/**
|
|
1043
|
-
* Pattern JWT令牌验证
|
|
1044
|
-
* @deprecated TypeScript 用户请使用 dsl(string).jwt()
|
|
1045
|
-
*/
|
|
1046
|
-
jwt(): DslBuilder;
|
|
1047
|
-
|
|
1048
|
-
/**
|
|
1049
|
-
* Pattern JSON字符串验证
|
|
1050
|
-
* @deprecated TypeScript 用户请使用 dsl(string).json()
|
|
1051
|
-
*/
|
|
1052
|
-
json(): DslBuilder;
|
|
1053
|
-
|
|
1054
|
-
/**
|
|
1055
|
-
* 日期大于验证
|
|
1056
|
-
* @deprecated TypeScript 用户请使用 dsl(string).dateGreater()
|
|
1057
|
-
*/
|
|
1058
|
-
dateGreater(date: string): DslBuilder;
|
|
1059
|
-
|
|
1060
|
-
/**
|
|
1061
|
-
* 日期小于验证
|
|
1062
|
-
* @deprecated TypeScript 用户请使用 dsl(string).dateLess()
|
|
1063
|
-
*/
|
|
1064
|
-
dateLess(date: string): DslBuilder;
|
|
1065
|
-
}
|
|
1066
|
-
}
|
|
817
|
+
|
|
818
|
+
// ========== String 扩展说明 ==========
|
|
819
|
+
|
|
820
|
+
/**
|
|
821
|
+
* ⚠️ String 原型扩展的 TypeScript 限制
|
|
822
|
+
*
|
|
823
|
+
* 本库在运行时扩展了 String.prototype,允许在 JavaScript 中直接链式调用:
|
|
824
|
+
* ```javascript
|
|
825
|
+
* const schema = dsl({ email: 'email!'.label('邮箱') }); // ✅ JavaScript 中完全正常
|
|
826
|
+
* ```
|
|
827
|
+
*
|
|
828
|
+
* 但在 TypeScript 中,为了**避免污染全局 String 类型**(会导致原生方法如 trim() 的类型推断错误),
|
|
829
|
+
* 我们**不提供**全局 String 接口扩展。
|
|
830
|
+
*
|
|
831
|
+
* TypeScript 用户请使用以下方式:
|
|
832
|
+
*
|
|
833
|
+
* @example
|
|
834
|
+
* ```typescript
|
|
835
|
+
* import { dsl } from 'schema-dsl';
|
|
836
|
+
*
|
|
837
|
+
* // ✅ 推荐:使用 dsl() 函数获得完整类型提示
|
|
838
|
+
* const schema = dsl({
|
|
839
|
+
* email: dsl('email!').label('邮箱').pattern(/custom/)
|
|
840
|
+
* });
|
|
841
|
+
*
|
|
842
|
+
* // ✅ 或者先定义再使用
|
|
843
|
+
* const emailField = dsl('email!').label('邮箱');
|
|
844
|
+
* const schema = dsl({ email: emailField });
|
|
845
|
+
*
|
|
846
|
+
* // ❌ 避免:在 TypeScript 中直接对字符串字面量链式调用
|
|
847
|
+
* // 这在运行时可以工作,但 TypeScript 无法提供类型提示
|
|
848
|
+
* const schema = dsl({
|
|
849
|
+
* email: 'email!'.label('邮箱') // TypeScript: 类型错误
|
|
850
|
+
* });
|
|
851
|
+
* ```
|
|
852
|
+
*
|
|
853
|
+
* 📝 说明:
|
|
854
|
+
* - JavaScript 用户不受影响,可以直接使用字符串链式调用
|
|
855
|
+
* - TypeScript 用户应使用 dsl() 函数包裹字符串以获得类型提示
|
|
856
|
+
* - 移除全局 String 扩展是为了防止污染原生 String 方法的类型定义
|
|
857
|
+
*/
|
|
1067
858
|
|
|
1068
859
|
// ========== dsl() 函数 ==========
|
|
1069
860
|
|
|
@@ -2955,3 +2746,4 @@ declare module 'schema-dsl' {
|
|
|
2955
2746
|
export default dsl;
|
|
2956
2747
|
}
|
|
2957
2748
|
|
|
2749
|
+
|