当前位置: 首页 > 科技观察

TypeScript被库开发者反感:类型是万恶之源

时间:2023-03-12 21:21:35 科技观察

今年的《2022 前端开发者现状报告》显示,84%的受访者表示他们使用过TypeScript,可见这门语言已经被越来越多的前端所接受端开发人员。他们说TypeScript使Web开发变得简单——无需多次在IDE和浏览器之间来回切换来猜测为什么“undefined不是函数”。不过redux-saga的工程师EricBower本周在一篇博客中提出了不同的意见。从库开发者的角度,他直言“我讨厌TypeScript”,并列举了五个理由。这篇博文发布后,立即引发了支持者和反对者的热议。其中,反对者主要认为文章中的理由只能算是开发者的意见,并没有提供具体的例子来证明实质性问题。redux-saga是一个库(Library),具体来说,在大多数情况下,它以Redux中间件的形式存在,主要是为了更优雅地管理Redux应用中的副作用(SideEffects)。以下是Eric的原文翻译:作为一个终端开发者,我其实很喜欢TypeScript。它大大减少了手动编写自动化测试的需要,并释放劳动力以投入到更多创造价值的领域。总之,任何能够削弱自动化测试工作量的技术都是生产力的巨大提升。但从库开发的角度来看,我讨厌TypeScript。它在很多方面都很烦人,但归根结底,TypeScript的原罪是降低了库开发人员的工作效率。从本质上讲,TypeScript将复杂性从终端开发人员转移到了库开发人员,最终显着增加了库开发过程方面的工作量。文档方面的开发者非常高兴,TypeScript已经为他们准备了完整的文档和博文。但在库开发人员方面,可用的资料非常少。我能找到的最接近于专注于类型操作的库开发需求的东西。这给人一种强烈的感觉,即TypeScript团队认为库开发人员和端侧开发人员之间没有区别。当然有区别,而且很大!为什么TypeScript网站上没有针对库开发人员的指南?为什么不能为库开发人员提供推荐工具列表?很多朋友可能想象不到,为了在Web应用程序和库中找到“正确”的类型,我们要经过什么样的战线。对于终端开发人员来说,Web应用程序开发基本上不涉及条件类型、类型运算符和重载等构造。但是库开发人员经常使用这些东西,因为这些构造是高度动态的并将逻辑嵌入到类型中。这让TypeScript的调度变得非常头疼。调试难题库开发人员如何调试高度动态、频繁使用的条件类型和重载?基本上就是硬着头皮硬拼,祈祷顺利。您唯一可以依靠的是TypeScript编辑器和开发人员自己的知识库。更改类型,然后查看最终结果,等等。据我所知,大家似乎都是跟着感觉走,并没有一个稳定可靠的科学方法。顺便说一句,库开发人员经常使用TypeScriptplayground来隔离类型逻辑的离散部分,以找出TypeScript解析为特定类型的原因。Playground还可以帮助我们轻松地在TypeScript版本和配置之间切换。但还不够,远远不够。我们需要更好的生产工具。太复杂了我玩了很多redux,redux-toolkit是一个非常棒的库,开发人员可以使用它来查看类型在实际代码库中是如何正确完成的。问题在于,虽然它使类型变得清晰,但它同样惊人地复杂。createAction#1createAction#2这只是一个示例,代码库中充满了更复杂的类型。此外,您还必须考虑代码的类型和实际数量。纯粹出于演示目的并忽略导入的代码,此文件中只有大约10%的代码(总共330行中的35行)被转换为JavaScript。编码准则通常建议开发人员不要使用嵌套的三元组。但在TypeScript中,嵌套三元组合构成了减少基于其他类型的类型范围的唯一方法。不……测试因为类型可以从其他类型生成,并且类型是高度动态的,所以任何生产级别的TypeScript项目都必须经过一类特殊的测试:类型测试。并且仅仅对最新版本的TypeScript编译器进行类型测试是不够的,必须测试所有以前的版本。这种新的测试形式才刚刚开始,可用的工具很少,而且有相当一部分要么被废弃,要么只进行了最低限度的维护。我之前用过的库有:DefinitelyTyped-toolssddtslint(moved)typings-checker(deprecated)可见类型测试工具的周转率非常高。而且由于迁移的困难,我的一些项目直到现在还在使用长期弃用的库。当然,其中的dtslint和tsd是比较靠谱的,但是是相辅相成,而不是二选一。为什么我们需要两种工具来完成同样的工作?这个问题很难回答,实际体验起来也挺难受的。维护类型会向库中添加大量代码。第一次为一个项目做贡献,首先需要了解应用逻辑和类型逻辑,这直接让很多打算参与的朋友望而却步。本人曾参与维护redux-saga,项目最近发布的PR和issues主要集中在类型方面。我发现我花在打字上的时间远远多于写库代码。我精通TypeScript,但不是专家级别。在使用TypeScript编程几年后,作为一个库开发人员,我仍然觉得自己不懂TypeScript。因此,熟练程度似乎成为了TypeScript的入门门槛。这里的万恶之源是类型,导致js库难以维护,切断了后续开发者的贡献和参与渠道。综上所述,我很认可TypeScript的成就,也很佩服它背后的开发团队。TypeScript的出现彻底改变了前端开发的面貌,这一贡献无人能忽视。但作为库开发人员,我们需要:更好的文档。更好的工具。使用tsc更容易。反正研究TypeScript编译器的源码,搞清楚为什么一段代码会被解析成某种类型,实在是太离谱了。