name: typescript description: 当用户询问“优化TypeScript性能”、“加速tsc编译”、“配置tsconfig.json”、“修复类型错误”、“改进异步模式”或遇到TS错误(TS2322、TS2339、“is not assignable to”)时,应使用此技能。也适用于涉及类型定义、模块组织或内存管理的.ts、.tsx、.d.ts文件工作。不涵盖TypeScript基础知识、框架特定模式或测试。
TypeScript最佳实践
TypeScript应用程序的全面性能优化指南。包含8个类别中的45条规则,按影响优先级排序,以指导自动化重构和代码生成。
何时应用
在以下情况下参考这些指南:
- 为新或现有项目配置tsconfig.json
- 编写复杂的类型定义或泛型
- 优化async/await模式和数据获取
- 组织模块和管理导入
- 审查代码的编译或运行时性能
按优先级分类的规则类别
| 优先级 | 类别 | 影响 | 前缀 |
|---|---|---|---|
| 1 | 类型系统性能 | 关键 | type- |
| 2 | 编译器配置 | 关键 | tscfg- |
| 3 | 异步模式 | 高 | async- |
| 4 | 模块组织 | 高 | module- |
| 5 | 类型安全模式 | 中-高 | safety- |
| 6 | 内存管理 | 中 | mem- |
| 7 | 运行时优化 | 低-中 | runtime- |
| 8 | 高级模式 | 低 | advanced- |
目录
- 类型系统性能 — 关键
- 1.1 为导出函数添加显式返回类型 — 关键(声明发出快30-50%)
- 1.2 避免深度嵌套的泛型类型 — 关键(防止指数级实例化成本)
- 1.3 避免大型联合类型 — 关键(二次O(n²)比较成本)
- 1.4 将条件类型提取到命名别名 — 关键(启用编译器缓存,防止重新评估)
- 1.5 限制类型递归深度 — 高(防止指数级类型扩展,当适用时)
- 1.6 优先使用接口而非类型交集 — 关键(类型解析快2-5倍)
- 1.7 简化复杂的映射类型 — 高(当适用时,减少类型计算50-80%)
- 编译器配置 — 关键
- 2.1 正确配置Include和Exclude — 关键(防止扫描数千个不必要文件)
- 2.2 启用增量编译 — 关键(重建快50-90%)
- 2.3 启用isolatedDeclarations以并行声明发出 — 关键(启用并行.d.ts生成,无需类型检查器)
- 2.4 启用skipLibCheck以加速构建 — 关键(编译快20-40%)
- 2.5 启用strictFunctionTypes以加速方差检查 — 关键(启用优化方差检查)
- 2.6 使用erasableSyntaxOnly用于Node.js原生TypeScript — 高(防止100%的Node.js类型剥离运行时错误)
- 2.7 使用isolatedModules用于单文件转译 — 关键(使用打包器转译快80-90%)
- 2.8 为大型代码库使用项目引用 — 关键(增量构建快60-80%)
- 异步模式 — 高
- 3.1 注解异步函数返回类型 — 高(防止运行时错误,改进推断)
- 3.2 避免在循环内使用await — 高(对于N次迭代快N倍,10用户=10倍改进)
- 3.3 避免不必要的async/await — 高(消除简单的Promise包装器,改进堆栈跟踪)
- 3.4 延迟await直到需要值 — 高(启用隐式并行化)
- 3.5 对独立操作使用Promise.all — 高(在I/O绑定代码中改进2-10倍)
- 模块组织 — 高
- 4.1 避免桶文件导入 — 高(导入成本200-800毫秒,捆绑包大30-50%)
- 4.2 避免循环依赖 — 高(防止运行时未定义错误和慢编译)
- 4.3 控制@types包包含 — 高(防止类型冲突并减少内存使用)
- 4.4 对大型模块使用动态导入 — 高(减少初始捆绑包30-70%)
- 4.5 对类型使用仅类型导入 — 高(消除类型信息的运行时导入)
- 类型安全模式 — 中-高
- 5.1 启用noUncheckedIndexedAccess — 中-高(在编译时防止100%的未检查索引访问错误)
- 5.2 启用strictNullChecks — 中-高(防止null/undefined运行时错误)
- 5.3 优先使用unknown而非any — 中-高(强制类型收窄,防止运行时错误)
- 5.4 对验证使用断言函数 — 中-高(减少验证样板代码50-70%)
- 5.5 对字面类型使用const断言 — 中-高(保留字面类型,启用更好推断)
- 5.6 对联合类型使用穷举检查 — 中-高(在编译时防止100%的缺失情况错误)
- 5.7 对运行时类型检查使用类型守卫 — 中-高(消除类型断言,在边界捕获错误)
- 内存管理 — 中
- 6.1 避免闭包内存泄漏 — 中(防止长寿命回调中的保留引用)
- 6.2 避免全局状态累积 — 中(防止无限内存增长)
- 6.3 清理事件监听器 — 中(防止无限内存增长)
- 6.4 清除定时器和间隔 — 中(防止回调保留和重复执行)
- 6.5 对对象元数据使用WeakMap — 中(防止内存泄漏,启用自动清理)
- 运行时优化 — 低-中
- 7.1 避免在热循环中使用对象展开 — 低-中(减少对象分配N倍)
- 7.2 在循环中缓存属性访问 — 低-中(在热路径中减少属性查找N倍)
- 7.3 优先使用原生数组方法而非Lodash — 低-中(消除库开销,启用树摇)
- 7.4 对简单迭代使用for-of — 低-中(减少迭代样板代码30-50%)
- 7.5 使用现代字符串方法 — 低-中(比正则表达式快2-5倍,对于简单模式)
- 7.6 对O(1)查找使用Set/Map — 低-中(每次查找从O(n)到O(1))
- 高级模式 — 低
- 8.1 对类型安全ID使用品牌类型 — 低(防止混合不兼容的ID类型)
- 8.2 使用satisfies进行类型验证与推断 — 低(防止属性访问错误,启用100%自动补全准确度)
- 8.3 对字符串模式使用模板字面类型 — 低(在编译时防止100%的字符串格式错误)