把一个现有的 JavaScript 项目迁移到 TypeScript 不需要一次全部重写。TypeScript 支持"渐进式迁移"——允许 .js 和 .ts 文件在同一项目中并存,逐个模块迁移。本文提供经过验证的迁移路径和工具链。
一、迁移策略
策略一:松耦合 → 严约束(推荐)
1. 安装 TypeScript,配置 allowJs(允许 JS 文件编译)
2. 把所有 .js 改为 .ts(不使用类型,先跑通编译)
3. 逐步添加类型注解(从 API 层/工具函数开始)
4. 开启 strict 模式,消除 any
策略二:边界优先
1. 先给公共 API 和接口加上 .d.ts 声明文件
2. 新模块一律用 .ts 编写
3. 旧模块遇到 Bug 重构时顺便迁移
4. 核心业务逻辑最后迁移(因为最复杂)
二、第一步:安装与配置
npm install -D typescript @types/node
npx tsc --init
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "bundler",
"allowJs": true, // ✅ 允许编译 JS 文件
"checkJs": false, // 先不检查 JS 的类型
"outDir": "./dist",
"rootDir": "./src",
"strict": false, // 先关闭严格模式
"esModuleInterop": true,
"skipLibCheck": true
},
"include": ["src/**/*"]
}
三、自动转换工具
ts-migrate(Airbnb 出品)
npx ts-migrate-full folder-name
功能:
- 批量重命名
.js→.ts - 自动添加
@ts-expect-error注释到类型错误处 - 自动添加
any类型占位
TypeStat
npx typestat --config typestat.json
功能更智能的自动类型推断工具。
四、渐进启用严格模式
{
"compilerOptions": {
"strict": false,
"noImplicitAny": true, // 第一步:禁用隐式 any
"strictNullChecks": true, // 第二步:null 检查
"strictFunctionTypes": true, // 第三步:函数类型严格
"strict": true // 最终:全部严格
}
}
五、第三方库类型处理
# 安装 DefinitelyTyped 类型声明
npm install -D @types/lodash @types/express
# 如果没有官方类型,创建 .d.ts 文件
echo "declare module 'legacy-lib';" > src/types/legacy-lib.d.ts
迁移检查清单
- 安装 TypeScript 和配置 tsconfig.json
- 配置 allowJs + rootDir
- 重命名核心模块为 .ts
- 处理第三方库类型声明
- 开启 noImplicitAny
- 启用 strictNullChecks
- 最终开启 strict: true
- CI 中添加 tsc 编译检查
相关阅读
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。
「frontend」更多文章
Vue 性能优化指南:虚拟列表、懒加载、渲染优化与 Core Web Vitals
Vue 3 应用性能优化完整策略:虚拟滚动(vue-virtual-scroller)、组件懒加载与异步组件、KeepAlive 缓存、Suspense 异步优化、v-memo 渲染记忆化、响应式性能(shallowRef/toRaw)、Bundle 分析与代码分割、渲染函数优化、以及 Core Web Vitals(LCP/INP/CLS)调优。
Nuxt.js 完全指南:Vue 全栈框架的 SSR、SSG、API 路由与部署实践
Nuxt.js 3 深度实践:文件系统路由、SSR/SSG/ISR 渲染模式、API 路由(Server Routes)、useFetch/useAsyncData 数据获取、中间件与插件、SEO 与 Meta 管理、Nitro 服务端引擎、自动导入、部署到 Vercel/Netlify/Node.js。
Vue 测试深度指南:Vitest + Vue Test Utils + Playwright E2E 与 CI 集成
Vue 3 应用从单元测试到 E2E 的完整测试策略:Vitest + Vue Test Utils 组件测试(mount/emits/slots/async)、Pinia Store Mocking、MSW API 拦截、Playwright 端到端测试、Cypress 组件测试、覆盖率标准与 GitHub Actions CI 集成。