反驳来了!放弃TypeScript?说明你无知!

作者 | Robert Vitonsky
编译 | 云中
 
几天前,汉森 (David Heinemeier Hansson)宣布 Turbo8 即将放弃 TypeScript 。我心想:放弃就放弃吧 , 反正我也不知道 Turbo 8 是什么鬼 。
 
然而,在过去的几年里,一些前端程序员试图向我推销“ TypeScript 没用,只测着玩玩”的想法 。我认为 , 有这种观点的人要么不关心代码质量,要么根本不知道 TypeScript 是什么 。在这里,我将解释为什么应该使用 TypeScript 。
 
注:本文作者 Vitonsky 是一名超过10年的有着复杂项目的前端大牛,参与了许多开源项目的开发:比如翻译网站的浏览器插件 Linguist、模块 UI 工具ElegantUI、翻译 DOM 节点的 DomTranslator 库等等 。
1、代码质量控制的“好手” 
代码质量控制是一个保持代码可维护性的复杂过程 。你不能仅仅用 100% 的测试覆盖代码 , 或者审查每个拉取请求并确保你的代码是可维护的,还应该让除你之外的其他人也可以识别并搞定它 。
 
根本无法保证自己的代码没有 bug 的同时具有完美的可维护性 。你只能在存储库中增加防御结构,以使其难以推送带有错误的“炸弹”代码 。阻止“炸弹”代码的障碍越多,代码质量就越好 。
 
这意味着你应该一起使用所有方法来保护存储库中的代码:单元/e2e/集成测试、代码审查、代码分析工具以及维护清晰的文档等 。
 
TypeScript 是一个强大的代码分析工具;它可以检测代码中的许多缺陷 。TypeScript 编译器迫使程序员确保代码在类型级别上是正确的 。David 和许多其他人低估了静态类型的价值 。
 
让我们看看 TypeScript 为代码质量带来了哪些好处 。
2、contract 对代码的重要性 
静态类型允许在代码中定义 contract 。 
 
type Participant = { id: string; name: string;};function sayHi(participant: Participant) { //... console.log(`Hi ${participant.name}`);} 该 sayHi 函数需要一个具有精确属性和精确类型的对象,并且它不关心该函数的用户将做什么来满足要求 。编译器确保类型正确 。
 
用户可能会提供一个不符合要求的对象并将类型强制转换为 any , 但这不是函数 sayHi 的问题 。这是一种责任委托,是开发人员必须理解的一个重要概念,才能正确使用 TypeScript 并获得其好处 。
 
程序员必须验证任何不受信任的数据,例如用户输入和其他 IO 数据,或与 JAVAScript 互操作的结果 。验证和设置类型后,他们可以将数据传递给 TypeScript 代码 , 并相信合同将得到遵守,因为 TypeScript 编译器已经检查了代码 。如果程序员强制转换类型,他们必须确保代码在运行时正确 。
 
如果你将项目中的非相交类型转换为任何非 unknown 的类型(没有运行时验证),那么代码质量可能存在问题 。
 
contract 可以避免为每个函数编写验证以确保数据正确 。这对于性能和代码整洁度来说都很好,代码变得愚蠢而简单 。
3、使用JS造成的不好经验和成本 
有时我会用纯 JavaScript 编写代码 , 主要是在浏览器控制台中 , 以便在网页上进行快速计算或数据解析 。几个月前,我为 Node.js 编写了一个使用 ChatGPT 翻译区域设置文件的脚本 。这些文件包含长文本,而 ChatGPT 有限制,因此需要一些时间对文本进行切片、翻译、在ChatGPT的结果中查找错误、根据需要重新翻译,然后将切片重新连接在一起 。根据区域设置文件的大小,此过程大约需要 3-5 分钟 。
 
在这个过程中,由于一些琐碎的类型错误,我浪费了一些时间,比如忘记使用 wAIt,这导致一个变量包含 Promise,并将“[object Promise]”写入文件而不是翻译文本,或者将错误的对象作为函数参数提供 。
 
TypeScript 消除了这样的错误 。
4、 TS更面向未来 
TypeScript 为你的代码提供了其他工具分析的潜力 , 因为它添加了上下文 。
 
使用 IDE,你可以重命名接口中的属性,并且实现该接口的所有实体将自动在各自的位置更新属性的名称 。
 
ChatGPT 和 Copilot 等 AI 工具受益于 TypeScript 提供的附加元信息 , 有可能改进代码分析和代码生成 。这些分析工具可以更好地识别潜在风险的代码 。
 
【反驳来了!放弃TypeScript?说明你无知!】


推荐阅读