何时应该使用TypeScript

原文链接:Medium
原作者:Alex Ewerlöf

类系统(Type System)就像是儿童自行车后面的辅助轮,让你不至跌到,然而代价是降低了速度,也限制了灵活性。

去年夏天,我转换了一个体量巨大的代码库(超过1.8万行代码),转换方向是从JavaScript到TypeScript。在这个过程中,我体会到了两种语言各自的优势和劣势,以及何时应该使用JavaScript,何时应该使用TypeScript。

TypeScript何时能够发挥作用

当数据库体积过大的时候

当你的数据库体积巨大,而且有多个人参与同一个项目,类系统能够帮你避免许多一般性的错误,尤其是在单页面程序的开发上。

当开发者推出重大更新的时候,拥有某种安全机制是非常重要的事情。TypeScript转译器能够揭示大多数明显的错误——尽管它并不能帮你跳过调试步骤。

如果你的数据库没有那么大,那么给它添加类注释,从而增加其体积,并不是什么明智的做法。我曾经将超过180个JavaScript文件转换为TypeScript,在大多数情况下,这种转换会让代码库的总体积增加30%。

当你团队的开发者已经习惯了静态类型语言的时候

如果你团队的大多数工程师最初学的都是C#或Java等强类型语言,而且不想全心全意的学习并使用JavaScript,那么TypeScript就成了非常好的替代语言。

虽然我也推荐所有人都去仔细学习JavaScript,但是如果你就是不想学的话,你也可以在不了解JavaScript的情况下轻松的使用TypeScript。事实上,TypeScript的创立者就是C#的创立者,因此两者之间的语法非常类似。

我公司中就有一个C#开发者团队。有一次公司要求他们作为以全栈开发者的身份加入一个Web项目。在很短的时间内,他们就学会了TypeScript用于前端开发,然后使用C#进行后端开发。

TypeScript可以作为Babel的替代品

以前微软曾经会选择某个标准工具——例如Java——然后给它添加一些微软独有专利的功能,例如把Java变成了J++。之后微软再强迫开发者在两者之间进行选择。

TypeScript其实也是这么诞生的,这一次他们修改的是JavaScript。其实这并不是微软第一次对JavaScript进行修改。1996年的时候,他们就曾经根据JavaScript做出了JScript。

虽然这么做的人并不多,但是我们的确可以使用TypeScript转译器将ES6代码转译为ES5。这种转译之所以可行,是因为ES6从本质上来说就是TypeScript的一个子类,而且TypeScript转译器可以生成ES5代码。

Typescript的转译器可以生成可读性非常高的ES5代码。正是出于这个原因,Angular 2在TypeScript和Google自己的Dart语言之中选择了前者。

另外,TypeScript还有一些ES6所欠缺的优秀功能,例如Enums,以及在构造器中对成员变量进行初始化的功能。我本身并不是“继承”这种处理方法的忠实拥趸,但是我发现,在类中拥有public、private、protected和abstract关键词是一个非常实用的功能。这些也是TypeScript所拥有,而ES6欠缺的功能。

当某个库或是框架推荐你使用TypeScript的时候

当你使用Angular 2或是其他推荐使用TypeScript的库的时候,别犹豫。

请注意,虽然TypeScript可以直接使用JavaScript库,但是如果你想要控制语法错误的数量,你需要在外部给这些库添加类型定义.幸运的是,DefinitelyTyped的一些开发者建立了一个社区驱动的repo,里面提供了完整的工具帮你添加类型定义。

当你需要速度的时候

你可能会觉得有点不可思议,但是在某些情况下,TypeScript代码在速度上的确优于JavaScript。我来解释一下,在我们的JavaScript代码中,我们要进行很多类型检查。我们开发的是一个名叫MedTech的医疗类应用,因此即使是最小的错误,如果没有得到良好的处理,都有可能导致真正“致命”的问题。因此很多函数都有这样的声明:

而在TypeScript中,我们可以跳过很多这样的类型检查。

跳过类型检查能起到什么效果?它让我们规避了此前的性能瓶颈,因为我们跳过了许多不必要的运行时类型检查。

何时不应该使用TypeScript?

当你没有时间和精力进行额外的转译时

目前的浏览器对于TypeScript都没有提供原生的支持。Chrome曾经做过这样的实验,尝试支持TypeScript,但是不久之后就取消了这个计划。我觉得这与不必要的运行时成本有关。

如果一个人需要辅助轮,他可以自己安装。但是辅助轮不应该成为自行车的永久部件。也就是说,在将Web应用运行在浏览器中之前,你总是需要将TypeScript进行转译。

而几乎所有浏览器都支持标准ES6,在这种情况下,把ES6转译为ES5,完全就是画蛇添足的做法。

在JavaScript语言中,ES6是最大的变化,我认为绝大多数程序员都会一直使用ES6。但是对于那些勇敢的探索者——想要探索浏览器尚未支持的JavaScript实验性功能的人——他们必须要进行转译。

如果你选择了TypeScript,你就需要做额外的记录,记录JavaScript库和框架的类型定义(你可以使用DefinitelyTyped,也可以自己写一个类型注释工具)。而在单纯的JavaScript项目中,你不用操心这些。

当你想要规避奇怪的调试edge case时

Sourcemap能让Typescript的调试过程变得简单,但是它还不完美。在对Typescript项目进行调试的时候,有的时候会发生一些让人头疼,而且找不到原因的edge case。另外,在调试“this”关键词及其附带的属性的时候,也会出现一些问题(提示:在大多数是时候“_this”可用)。这是由于Sourcemap目前对变量的支持还不够好——但是这个问题在未来应该会有所改观。

当你想要避免潜在的性能代偿时

在我们的项目中,我们有着超过9000行ES5 JavaScript代码,这些代码为3D WebGL提供了足够的马力。我们也一直保留着这些代码。

与Babel一样,TypeScript的转译器的一些功能也会生成额外的代码(继承、enum、generics和async/await等)。无论你的转译器有多好,它都无法代替优秀编程人员对代码的优化。因此,我们决定将代码保持为ES5,从而降低调试和部署的难度(不需要转译)。

话虽如此,但是与类系统和现代语法带来的好处相比,其性能代偿几乎可以忽略不计。但是在某些场合下,一毫秒、甚至一微秒都很重要,在这样的情况下,任何类型的转译器我们都不推荐使用。

请注意,在运行时类别检查的适合,Typescript不会添加任何额外的代码。所有类别检查都发生在转译的过程中,在生成的JavaScript代码中,类别注释也会被移除。

当你需要将团队的敏捷度进行最大化的时候

建立项目的时候,JavaScript的速度更快。类系统的欠缺,让敏捷度大大增加,也降低了更改的难度,但是出错的几率也更大,因此你必须要确认自己知道正在做什么。Javascript更灵活,请记住类系统最主要的使用目的之一,就是出错的几率。如果将Typescript比喻为Windows,那么JavaScript就是Linux。

在JavaScript这块土地上,你没有辅助轮的帮助,计算机默认你知道自己当前在做什么,但是没有辅助轮能让你的骑行速度更快,转弯也更灵活。

需要特别说明的是,如果你的项目现在还在原型开发阶段,那么不要把时间浪费在TypeScript上,因为JavaScript要灵活的多

请记住TypeScript是JavaScript的超集。也就是说,在未来如果你需要的话,可以轻松的将JavaScript转换为TypeScript。

我个人对JavaScript和TypeScript的选择

这个世界上就不存在“最好的语言”。但是对于每一个项目来说,我们可以找到最适合的语言、库、框架、数据库、操作系统……

在开发我们的应用过程中,TypeScript就是这个最适合的语言。我有一些处于爱好做的项目,我尝试了使用TypeScript对这些项目进行重新开发,但是体验糟透了。对于TypeScript,我个人觉得它有四个优点:

  1. 完全兼容ES6。看到微软的这个语言也支持其他浏览器,我很高兴。在谷歌、Mozilla和苹果之外,浏览器生态系统能出现另一个强大的竞争对手,生态中的所有人都能够从中收益。
  2. 类系统可以按照需求选择。由于我有着C和Java语言的背景,因此我一直觉得JavaScript缺少类系统是件不方便的事情。但是在运行时遇到错误的时候,我有很讨厌将时间浪费在调试上。TypeScript让我可以避免很多普遍性的错误,让我专注在解决真正棘手的问题上。这是一个很好的平衡。
  3. 转译器的输出可读性很高。我不是Sourcemaps的拥趸,但是我大多数进行调试的时候,使用的都是转译器生成的JavaScript。我非常能够理解Angular 2为何选择了TypeScript,而放弃了Dart。
  4. TypeScript的工具组太好了。在处理JavaScript的时候,WebStorm非常智能(甚至有人认为它是最智能的JS IDE)。但是TypeScript打破了限制。VSCode中的自动完成和重构功能运行起来更加精确,而这并不是因为IDE有多智能,而是要感谢TypeScript。

Typescript并不是解决一些问题的良药,在使用它的时候,你依然有可能写出糟糕的代码。

讨厌TypeScript的人还将继续讨厌下去。有的人是因为害怕改变,有的人则仅仅是因为认识其他一些讨厌TypeScript的人,于是他们也跟着人云亦云。但是无论如何,TypeScript都会不断的给它的支持者们献上新的功能。

和React一样,TypeScript也是最有影响力的技术之一,它让Web开发升上了一个新的台阶。

无论你是否使用TypeScript,尝试一下都不会让你少块肉。你肯定会经历一个学习曲线,但是如果你非常了解JavaScript,你的学习过程不会太长。

本文翻译已获得原作者授权,欢迎转载,但请注明出处。感谢热心读者 大雾 指出翻译中的错误。

5条回应:“何时应该使用TypeScript”

  1. kylesean说道:

    翻译的很好
    作者写的也很好,nice

    [回复]

  2. christian7up说道:

    谢谢您的肯定。

    [回复]

  3. Timer说道:

    codebase: 代码库
    database:数据库

    [回复]

  4. 大雾说道:

    翻译错了,在“请记住TypeScript是JavaScript的子类。也就是说,在未来如果你需要的话,可以轻松的将JavaScript转换为TypeScript。”中,这里第一句其实是“TypeScript是JavaScript的超集”,原文为“Remember that TypeScript is a superset of JavaScript.”

    [回复]

    christian7up 回复:

    @大雾 多谢

    [回复]

发表评论

电子邮件地址不会被公开。 必填项已用*标注