TypeScript 在实际项目中如何渐进式引入?
1. 初始配置
- 安装 TypeScript:npm install --save-dev typescript
- 生成配置文件:npx tsc --init
- 修改 tsconfig.json 以支持渐进式采用:
- "allowJs": true:允许编译 JavaScript 文件
- "checkJs": false:暂不对 JavaScript 文件进行类型检查
- "strict": false:初始时关闭严格模式
- "noEmit": true:仅执行类型检查,不生成输出文件
2. 从叶子节点开始转换
- 优先转换依赖关系最少的文件:工具函数、常量定义、纯函数模块
- 这些文件通常最简单,转换后能立即获得类型安全,且不会引发复杂的类型错误链
- 逐步向依赖更多的文件扩展,直到覆盖整个项目
3. 文件转换步骤
- 将 .js 文件重命名为 .ts(或 .tsx 用于包含 JSX 的 React 组件)
- 修复编译器报告的初始错误,主要是隐式 any 类型
- 为函数参数和返回值添加显式类型注解
- 为复杂对象创建 interface 或 type 定义
- 对于暂时无法处理的复杂类型,可以使用 any 作为过渡,但应标记为待办项
4. 逐步启用严格模式
- 不要一次性开启所有严格检查,而是逐个启用:
- 先启用 noImplicitAny:修复隐式 any 类型
- 再启用 strictNullChecks:处理 null 和 undefined
- 最后启用完整的 strict: true
- 可以使用多个 tsconfig.json 文件,为不同目录设置不同的严格程度
- 使用项目引用(Project References)隔离不同严格程度的代码
5. 边界类型封装
- 为第三方库或未类型化的代码创建类型接口,减少类型错误的传播范围
- 使用 unknown 类型处理外部输入,在使用前进行类型收窄
- 为关键依赖创建声明文件(.d.ts),提供基本的类型支持
6. 工具链集成
- 在 CI 中运行 tsc --noEmit 进行类型检查
- 配置 ESLint 的 TypeScript 插件,强制类型相关的代码规范
- 使用 ts-migrate 等自动化工具批量转换文件
- 使用 jscodeshift 编写 codemod 脚本自动化类型注解的添加