微信号:gh_bd8d6a989787

介绍:介绍各种前端技巧,帮助提高前端开发的速度,逐渐做到分分钟完成开发.

JavaScript vs. TypeScript vs. ReasonML

2019-04-10 08:30 web前端程序员

在这篇博文中,我将对三种编程语言的优缺点进行阐述,分别是:JavaScript、TypeScript以及ReasonML。本文的内容基于最近在一些较小的实际项目上使用TypeScript和ReasonML的经验以及多年的JavaScript经验。

1.   静态类型的优缺点

优点:

  • 文档:对于大多数代码,记录参数类型是非常有用的,这样可以方便区分调用者和被调者。

  • 好处远不止这些。当我重新访问旧的JavaScript代码库来添加静态类型时,我可能已经忘了它是如何工作的了。有了这些类型,可以更清楚地说明一切是如何运行的。例如,为了给某函数的参数添加类型注释,我经常不得不访问它的调用位置。也就是说,类型暗示了“如何使用这个函数?”的信息。

  • 编辑器中的自动补齐功能可以说是“更好的文档”。这意味着在使用API时,可以减少查阅文档的频率(良好的注释也是很有帮助的)。例如,当我在2006年开始DOM编程时,我是通过GWT(基于Java,且出于多种原因,是当时最流行的解决方案)实现的。由于Eclipse的自动补齐功能,探索和学习DOM API变得十分有趣。

  • 一种快速检验参数类型的方法。对某些函数(看起来像不必要的样板代码)添加程序化类型检验时,我会尝试在JavaScript中使用静态类型。

  • 有助于重构(在枚举中添加成员等)。

缺点:

  • 需要花时间来学习。

  • 这是一个复杂的附加层,需要在不同的层级上再次编写代码。

  • 表达受限。如果使用了泛型、co-variance和contra-variance(例如,一个字符串数组不是一个对象数组的子类型)等等,那么一切将变得复杂。

  • 无法阻止错误的出现。至少目前研究表明是这样的。根据我的经验,确实可以捕捉某类错误(例如,没有验证null)。但是如果采用单元测试而不是添加静态类型的话,或许我能够更早地捕捉到它们。所以要检验较为严重的错误时,最好进行测试。

  • 丧失可交互性且编译需要时间。另一方面,在JavaScript生态系统中,避免编译几乎是不可能的。

2.  ReasonML

  • 如果想体验静态类型提供的最佳功能,请使用ReasonML(或者OCaml,ReasonML基于此开发的)。例如,几乎所有的语言特性都是经过精心设计的,因此只需要最少量的类型注释即可(通过支持类型推断)。

  • 令人印象深刻的是,尽管时间已经久远(尤其是对编辑器的支持),一些重要的部分仍在更新:更好地支持Promises、迭代和异步迭代;改进名为Belt的标准库;改进JavaScript的互用性(这已经很不错了,但比我想要的复杂多了);更好地支持Unicode字符串。

  • ReasonML的构建时间非常短,比TypeScript快得多,这绝对是个优势。

  • 它绑定了一些JavaScript库,但选择仍然有限:请参阅Reason Package Index

  • 可以选择原生。例如,Jared Forsyth用ReasonML编写了游戏Gravitron,可以在Android,IOS,web和macOS上运行。

有关ReasonML的更多信息,请参阅“探索ReasonML和函数式编程”(可以免费在线阅读)。

3.  TypeScript

  • TypeScript的类型系统比我预期的更轻量级。比起Java,它更像FP。例如,假设创建一个接口,这个接口将“匹配”由该接口描述的形状的所有对象。你可以随时引入接口而无需改动现有的代码。

  • 这个类型系统非常强大和直观。鉴于联合类型(union types)交叉类型(intersection types)以及可辨识联合类型(discriminated union types),你可以将许多惯用的JavaScript类型变成静态化类型。

  • 支持编辑器(如Visual Studio Code,WebStorm等),都非常好用。

  • 许多npm软件包要么带有静态类型定义,要么具有易于安装的外部定义。更多相关信息,请参阅DefinitelyTyped

  • 通常,JavaScript互用性非常好。但有一个例外:通过对象字面量来模拟命名参数不必要对类型静态化(更多信息)。

总结:相比JavaScript和ReasonML的特性,TypeScript占据了很好的中间地带。我很想了解它在大型项目中的效果如何。

4.  JavaScript

  • 整个生态系统在不断地推陈出新(如Babel等)。

  • 可以通过npm获取各类兼容性库。

  • 可以随时更新动态。

  • 可以选择在没有构建步骤的情况下探索和创建代码。

有关JavaScript的更多信息,请参阅我的系列书籍“探索JS”(可以免费在线阅读)。

5.  结论:JavaScript的生态系统比以往更强大

是否使用静态类型取决于个人。我的建议是:

  • 用你喜欢和熟悉的那类语言。

  • 对目前正在使用的语言的优缺点有所认知。

就个人而言,一旦项目增长超过一定规模(或者我预计它最终会变得那么大),我就开始使用某种静态类型。

目前,JavaScript生态系统的优势和多样性令人惊叹:你可以根据需求(以及不同程度的工作)在JavaScript、ReasonML和TypeScript之间切换。它们可以共享一些工具、库以及语法。例如,当使用ReasonML需要快速模板解决方案时,我可以通过npm使用基于JavaScript的EJS库

最后,除此之外还有许多其他好的选择:静态类型检查器Flow函数式编程语言Elm等。

英文原文:http://2ality.com/2018/03/javascript-typescript-reasonml.html

译者:我是昵称耶~
 
web前端程序员 更多文章 预加载、预取和其他<link>标记 JavaScript生态系统总览(1) 我并不讨厌箭头函数 未来的JavaScript还缺少哪些特性?(1) Web组件简介
猜您喜欢 snipMate 代码片段 | Vim 看国外女神级程序员,直播写代码一年的感悟 眼动测试:从0到1 神器:VSCode 的 cquery 插件 Java程序员关于跳槽的经验之谈