TypeScript 使用指南
版本: schema-dsl v2.0.0-beta.2
更新日期: 2026-05-08
重要: v1.0.6 移除了全局 String 类型扩展以避免类型污染
📋 目录
1. 快速开始
1.1 安装
1.2 基础用法
2. TypeScript 中的链式调用
2.1 重要变更(v1.0.6)
v1.0.6 移除了全局 interface String 扩展,原因:
- ❌ 全局类型扩展会污染原生 String 类型
- ❌ 导致
trim()、toLowerCase()等原生方法的类型推断错误 - ❌ 影响所有使用 TypeScript 的项目的类型安全
结果:在 TypeScript 中直接对字符串链式调用会报类型错误:
2.2 正确用法 ⭐⭐⭐
TypeScript 中必须使用 dsl() 函数包裹字符串,才能获得类型提示和链式调用:
好处:
- ✅ 获得完整的类型推导和 IDE 自动提示
- ✅ 不污染原生 String 类型(
trim()正确返回string) - ✅ 更好的类型安全和开发体验
2.3 工作原理
3. 类型推导最佳实践
3.1 方式对比
3.2 推荐写法
✅ 方式 1: 内联使用 dsl() 包裹(最推荐)
优点:
- ✅ 完整的类型推导
- ✅ IDE 自动提示所有方法
- ✅ 代码紧凑,逻辑清晰
✅ 方式 2: 先定义字段,再组合(适合复用)
优点:
- ✅ 字段定义可复用
- ✅ 代码更模块化
- ✅ 适合大型项目
❌ 不推荐的写法
4. 完整示例
4.1 用户注册表单
4.2 API 请求验证
4.3 表单字段复用
5. 常见问题
5.1 为什么 TypeScript 中字符串链式调用没有类型提示?
原因: TypeScript 对全局 String.prototype 扩展的类型推导有限制。
解决: 使用 dsl() 包裹字符串:
5.2 JavaScript 用户需要改变写法吗?
不需要! JavaScript 用户可以继续使用字符串链式调用:
5.3 如何在严格模式下使用?
在 tsconfig.json 中启用严格模式也没问题:
只需使用 dsl() 包裹即可:
5.4 如何获取验证后的数据类型?
使用泛型参数:
5.5 如何处理嵌套对象的验证错误?
6. 进阶技巧
6.1 额外业务规则
这种写法的好处是:结构校验仍由 schema-dsl 负责,业务唯一性、数据库查重等规则继续留在 TypeScript 业务层,避免把外部依赖塞进字段声明。
6.2 条件验证
6.3 Schema 复用和扩展
7. 性能优化
7.1 复用 Schema 与默认缓存
7.2 缓存配置
8. 最佳实践总结
- ✅ TypeScript 中始终使用
dsl()包裹字符串 - ✅ 使用
validateAsync进行异步验证 - ✅ 为验证结果添加泛型类型参数
- ✅ 复用常用字段定义
- ✅ 使用
ValidationError类型守卫处理错误 - ✅ 为用户提供友好的错误消息
- ✅ 复用常用 Schema 对象,让默认缓存命中
9. 相关资源
对应示例文件
示例入口: typescript-guide.ts
说明: 展示 TypeScript 下推荐的 dsl() 包裹写法、validate<T>() / validateAsync<T>()、以及 ValidationError 的字段错误读取方式。
更新日期: 2026-05-08
文档版本: v2.0.0-beta.2