作者:Dr. Axel Rauschmayer翻译:疯狂的技术宅
原文:https://2ality.com/2020/04/mi...
未经允许严禁转载
本文概述了将代码库从 JavaScript 迁移到 TypeScript 的策略。还提到了需要进一步阅读的材料。
三种迁移策略
这是用于迁移到TypeScript的三种策略:
- 对于我们的代码库,可以支持 JavaScript 和 TypeScript 文件的混合。我们仅从 JavaScript 文件开始,然后将越来越多的文件切换到 TypeScript。
- 我们可以继续使用普通的 JavaScript,并通过 JSDoc 注释添加类型信息,直到全部完成为止。这时我们就可以切换到 TypeScript。
- 对于大型项目,在迁移过程中可能会遇到太多 TypeScript 错误。针对错误的快照进行测试会有所帮助。
更多信息:
- TypeScript 手册中的“从 JavaScript 迁移”
策略1:JavaScript/TypeScript 混合代码库
如果我们用编译器选项 --allowJs
,则 TypeScript 编译器支持 JavaScript 和 TypeScript 文件的混合:
- TypeScript 文件被编译。
- 将 JavaScript 文件简单地复制到输出目录中(经过一些简单的类型检查之后)。
首先,只有 JavaScript 文件。然后我们一个接一个地将文件切换到 TypeScript。在这样做的同时,我们的代码库也在不断的被编译。
这是 tsconfig.json
的样子:
{
"compilerOptions": {
···
"allowJs": true
}
}
更多信息:
策略2:将类型信息添加到纯 JavaScript 文件
这个方法的工作方式如下:
- 我们将继续使用当前的构建架构。
- 我们运行 TypeScript 编译器,但仅作为类型检查器(编译器选项
--noEmit
)实用。 - 通过 JSDoc 注释(请参见下面的示例)和类型定义文件添加类型信息。
- 一旦 TypeScript 的类型检查器不再报错,我们将用编译器来构建代码库(类似于先前的策略)。现在不急着从
.js
文件切换到.ts
文件,因为整个代码库已经完全有了静态类型。现在我们甚至可以生成类型文件(文件扩展名为.d.ts
)。
以下是通过 JSDoc 注释为普通 JavaScript 指定静态类型的方式:
/**
* @param {number} x - A number param.
* @param {number} y - A number param.
* @returns {number} This is the result
*/
function add(x, y) {
return x + y;
}
/** @typedef {{ prop1: string, prop2: string, prop3?: number }} SpecialType */
/** @typedef {(data: string, index?: number) => boolean} Predicate */
更多信息:
- TypeScript 手册中的“对 JavaScript 文件进行类型检查”
- Oliver Joseph Ash 写的 “我们是如何逐步平稳的迁移到 TypeScript 的”
策略3:通过快照测试 TypeScript 错误迁移大型项目
在大型 JavaScript 项目中,无论我们选择哪种方法,切换到 TypeScript 都可能会产生大量错误。可以选择快照测试 TypeScript 错误:
- 我们第一次在整个代码库上运行编译器。
- TypeScript 编译器产生的错误成为我们的初始快照。
- 在的代码上工作时,我们将新的错误输出与以前的快照进行比较:有时错误消失了。然后就可以创建一个新的快照。有时会出现新的错误。此时我们要么必须纠正此错误(如果可以),要么创建一个新的快照。
更多信息:
结论
我们快速学习了各种迁移到 TypeScript 的策略。另外还有两个提示:
- 先实验性的进行迁移:在你的代码库上尝试各种方法,然后选择其中的一种。
-
然后为下一步制定清晰的计划。需要与你的团队交流优先顺序:
- 有时可能需要优先完成快速迁移。
- 有时,在迁移过程中保持完整功能的代码可能具有优先权。
- 等等...
当你把代码库从 JavaScript 迁移到 TypeScript 时都经历些什么?请在评论中告诉大家!
本文首发微信公众号:前端先锋
欢迎扫描二维码关注公众号,每天都给你推送新鲜的前端技术文章
欢迎继续阅读本专栏其它高赞文章:
- 深入理解Shadow DOM v1
- 一步步教你用 WebVR 实现虚拟现实游戏
- 13个帮你提高开发效率的现代CSS框架
- 快速上手BootstrapVue
- JavaScript引擎是如何工作的?从调用栈到Promise你需要知道的一切
- WebSocket实战:在 Node 和 React 之间进行实时通信
- 关于 Git 的 20 个面试题
- 深入解析 Node.js 的 console.log
- Node.js 究竟是什么?
- 30分钟用Node.js构建一个API服务器
- Javascript的对象拷贝
- 程序员30岁前月薪达不到30K,该何去何从
- 14个最好的 JavaScript 数据可视化库
- 8 个给前端的顶级 VS Code 扩展插件
- Node.js 多线程完全指南
- 把HTML转成PDF的4个方案及实现
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。