您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > javascript

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

时间:2023-09-15 13:08:17  来源:51CTO  作者:

作者 | 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 迫使程序员处理一个状态可能具有的所有可能情况,从而增强代码可靠性。

5、类型:复杂性与质量的取舍

 

汉森还说道说:

 

“TypeScript 对我来说只是阻碍。不仅因为它需要显式的编译步骤,还因为它用‘类型体操’污染了代码,这给我的开发体验增添了很少的乐趣,而且常常带来相当大的悲伤。应该容易的事情变得困难,而困难的事情变成了‘any’。所以不用了,谢谢!”

 

确实,有时必须编写重要的类型,才能让编译器相信你的数据是正确的。但事实就是这样:创建高质量的可维护代码通常需要付出艰苦的努力。

 

6、结论:会用的人不会抱怨工具

 

TypeScript 只是一个工具,如果你简单地启用它,它不会自动提高代码质量。你的项目必须制定正确使用该工具的规则,以及执行这些规则的架构师。规则越严格越好。

 

当在项目中禁用静态类型时,你将失去许多控制代码质量的功能。

 

JS 文档和 .d.ts 类型声明文件无法替代代码的静态类型。它们只是声明实体外部 API 的方法,但不允许分析实体内的代码(函数、类和其他代码块)。 

 

原文链接:https://vitonsky.NET/blog/2023/09/08/typescript-and-code-quality/



Tags:TypeScript   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除。
▌相关推荐
作者 | Robert Vitonsky编译 | 云中 几天前,汉森 (David Heinemeier Hansson)宣布 Turbo8 即将放弃 TypeScript。我心想:放弃就放弃吧,反正我也不知道 Turbo 8 是什么鬼。 然而...【详细内容】
2023-09-15  Tags: TypeScript  点击:(0)  评论:(0)  加入收藏
JavaScript 依靠抛出异常来处理错误,而 Go 和 Rust 将它们视为值。 你可能认为这没什么大不了的……但是,孩子,这可能听起来微不足道; 然而,它改变了游戏规则。那么,...【详细内容】
2023-09-07  Tags: TypeScript  点击:(9)  评论:(0)  加入收藏
【CSDN 编者按】本文所提到的这些功能,你最希望哪个能实现。原文链接:https://www.totaltype.com/type-5-3作者 | Matt Pocock 翻译 | ChatGPT责编 | 梦依丹出品 | CSDN(ID:CSDN...【详细内容】
2023-08-30  Tags: TypeScript  点击:(22)  评论:(0)  加入收藏
概述TypeScript是一种强类型的编程语言,它通过接口(Interfaces)和类(Classes)等特性来增强JavaScript的类型系统。接口和类的结合可以用于实现复杂的类型定义、模块化开发和代码...【详细内容】
2023-08-23  Tags: TypeScript  点击:(21)  评论:(0)  加入收藏
TypeScript 和 JavaScript 是两种互补的技术,共同推动前端和后端开发。在本文中,我们将向您快速了解JavaScript 与 TypeScript的区别。一、TypeScript 和 JavaScript 之间的区...【详细内容】
2023-08-14  Tags: TypeScript  点击:(22)  评论:(0)  加入收藏
原文作者:Shalitha Suranga原文地址:https://blog.logrocket.com/how-to-debug-typescript-chrome/翻译:一川软件错误是编程错误或软件程序的意外行为。调试是指检查和删除软件...【详细内容】
2023-07-10  Tags: TypeScript  点击:(86)  评论:(0)  加入收藏
TypeScript是一种静态类型检查的编程语言,它内置了许多基本数据类型,如字符串、数字和布尔型等。除了基本数据类型,当某种类型对于大多数代码来说都非常有用时,它们就会被添加...【详细内容】
2023-05-12  Tags: TypeScript  点击:(163)  评论:(0)  加入收藏
当你学习TypeScript时,你的第一印象可能会欺骗你:这不就是JavaScript注解的一种方式吗?不就是编译器用来帮助我找到潜在bug的吗?虽然这种说法没错,但随着你对TypeScript不断了解...【详细内容】
2023-04-21  Tags: TypeScript  点击:(99)  评论:(0)  加入收藏
TypeScript 是一种类型安全的 JavaScript 超集,除了基本类型和对象类型之外,TypeScript 还提供了一些高级类型系统,使得我们可以更好地处理复杂的数据结构和业务逻辑。本文将深...【详细内容】
2023-03-28  Tags: TypeScript  点击:(99)  评论:(0)  加入收藏
介绍TypeScript 是一种广泛使用的开源编程语言,非常适合现代化开发。借助它先进的类型系统,TypeScript 允许开发者编写更加强健、可维护和可扩展的代码。但是,要真正发挥 TypeS...【详细内容】
2023-03-16  Tags: TypeScript  点击:(138)  评论:(0)  加入收藏
▌简易百科推荐
作者 | Robert Vitonsky编译 | 云中 几天前,汉森 (David Heinemeier Hansson)宣布 Turbo8 即将放弃 TypeScript。我心想:放弃就放弃吧,反正我也不知道 Turbo 8 是什么鬼。 然而...【详细内容】
2023-09-15    51CTO  Tags:TypeScript   点击:(0)  评论:(0)  加入收藏
译者 | 刘汪洋审校 | 重楼概括:这篇文章介绍了 JavaScript 中各种循环语句的特点和性能,以及如何根据不同的场景选择合适的循环方式。文章通过一些实例和测试,给出了一些使用循...【详细内容】
2023-09-13    51CTO  Tags:JavaScript   点击:(4)  评论:(0)  加入收藏
Json Path介绍看它的名字你就能知道,这Json Path和JSON文档有关系,正如XPath之于XML文档一样,JsonPath为Json文档提供了解析能力,通过使用JsonPath,你可以方便的查找节点、获取想...【详细内容】
2023-09-12  九天银河888  今日头条  Tags:JsonPath   点击:(1)  评论:(0)  加入收藏
作者丨P. Rehan编译丨诺亚“Node.js有危险了!”“任何能够自救的开发人员都应该尽快迁移到另一个后端环境!”JavaScript的仇恨者说。不用理会这些言论。Node.js将继续存在,并...【详细内容】
2023-09-09    51CTO  Tags:Node.js   点击:(6)  评论:(0)  加入收藏
根据 MDN:“闭包是捆绑在一起(封闭)的函数及其周围状态(词法环境)的引用的组合。换句话说,闭包使您可以从内部函数访问外部函数的作用域。在 JavaScript 中,每次创建函数时都会创建...【详细内容】
2023-09-07  web前端开发  微信公众号  Tags:JavaScript   点击:(9)  评论:(0)  加入收藏
JavaScript 依靠抛出异常来处理错误,而 Go 和 Rust 将它们视为值。 你可能认为这没什么大不了的……但是,孩子,这可能听起来微不足道; 然而,它改变了游戏规则。那么,...【详细内容】
2023-09-07  启辰8  今日头条  Tags:TypeScript   点击:(9)  评论:(0)  加入收藏
你一定听说过 console.log() ,而且可能一直在使用它。它非常流行,在集成开发环境中键入时,Visual Studio Intellicode 等工具通常会在其他控制台方法之前推荐使用它。在本文中,...【详细内容】
2023-09-06  大迁世界  微信公众号  Tags:JavaScript   点击:(22)  评论:(0)  加入收藏
JavaScript 是一种功能强大的语言,是网络的主要构建块之一。这种强大的语言也有一些怪癖。例如,您是否知道 0 === -0 的计算结果为 true,或者 Number("") 的结果为 0?问题是,有时...【详细内容】
2023-09-05  web前端开发  微信公众号  Tags:JavaScript   点击:(28)  评论:(0)  加入收藏
数组,是 JavaScript 中的基本数据结构,允许我们存储和操作值的集合。通常,数组可以嵌套,这意味着它们包含其他数组作为元素。虽然嵌套数组对于组织数据很有用,但在某些情况下我们...【详细内容】
2023-09-04  web前端开发  微信公众号  Tags:JavaScript   点击:(32)  评论:(0)  加入收藏
Three.js 是一个开源的 JavaScript 3D 图形库,用于创建和展示高性能、交互式的 3D 图形场景。它建立在 WebGL 技术之上,并提供了丰富的功能和工具,使开发者可以轻松地构建令人...【详细内容】
2023-09-01  前端充电宝  微信公众号  Tags:JavaScript   点击:(33)  评论:(0)  加入收藏
站内最新
站内热门
站内头条