JavaScript的另一个替代品:ReScript

6,524

已经有了CoffeeScript、TypeScript、PureScript,现在又有了ReScript。它是最近才出现的,而且正试图取代古老的、由微软支持的TypeScript的位置。

ReScript与其他所有替代品有什么不同?

和其他许多替代品类似,它也是一个关于强类型系统的JavaScript”应该是什么样子“的观点式版本。根据他们的网站,这个类型系统应该:

  • 比Typescript的更好,因为它更简单,而且是推断式的。TS可以推断一些类型,但它并不建议这样做。但是ReScript可以,而且他们的解释器在捕捉这些类型错误方面也相当出色。
  • 它是静态的,因为它在运行时不被使用。你可能会好奇,这是否是对问题的过度简单化。但是根据官方的说法,编译期间的静态推理正是你所需要的,以确保代码不受那些讨厌的错误的影响。
  • 它的速度很快。有开发者用该语言进行测试后证明了这一点。有了VSCode插件, 你所要做的就是保存文件,得到即时的反馈。

他们的类型系统听起来很不错,但这并不是TS能成为更好的替代品的全部原因。还有一个事实是,它并不试图成为JavaScript的超集,而是一个精心策划的功能列表。

这意味着它将原始语言提炼成它认为合适的东西。这意味着在实践中,你将没有类这样的结构,没有控制台这样松散的全局对象,也没有分号这样的东西。

你作为一个JavaScript(或TypeScript)的开发者,想要了解一个新事物意味着你必须重新学习语言。这不仅仅是用RS添加类型注解,你还必须重新学习所有东西的工作原理。这是不是太麻烦了?但是如果你也使用过其他语言,如Ruby或Python的话,这一转变应该不会很困难。

例如,现在的IF语句变成了。

image.png

IF条件的括号不再需要了。IF的主体是一个表达式,返回最后执行的行。你可以把整个结构分配给一个变量,就像你在vanilla JS中使用三元操作符那样。

ReScript 在 JavaScript 方面有什么新特点?

作为一个JS开发者,你期望RS增加了什么价值?

除了推断类型系统外,还有:

  • 管道,它是一种反向编写函数调用的方式。换句话说,如果你有myFunction(argument),你可以做argument->myFunction,从而模仿缺少的OOP方法。
  • 现在已经没有const了。事实上,现在所有东西都是常量。或者换句话说,现在你用let声明你的变量,就像你在JS中用const声明一样。你可以用let重新定义变量,从而取代它的旧值,虽然不推荐,但这是实现突变的一种方式。
  • 模式匹配。RS将模式匹配添加到switch语句中。通过模式匹配,可以测试记录/变量的形状而不是它们的值。鉴于任何旨在解决这个问题的OOP模式都不会被你利用,所以这是一个非常需要的功能。

鉴于模式匹配 是继RS的类型推理之后最好的功能,可以看一个例子:

image.png

正在声明一个具有特定形状的Teacher类型的记录,在switch里面还有一个叫做Student的记录类型。switch的模式匹配功能允许我们检查变量person1的形状,并根据我们是否在处理一个Teacher来做不同的事情。甚至在每个匹配块里面,你都可以把匹配的对象解构为变量,然后可以使用这些变量。

这绝对是一个强大的功能,因为你不能声明多个类并在它们里面封装这种行为。

除此之外,RS还带来了其他什么吗?还有一大堆已知概念的重命名。

RS的重命名

RS在重命名或改变我们处理旧概念的方式方面做得很好。

例如:

  • Tuples。由于数组必须是类型化的,也就是说,它们里面只需要包含一种类型的变量,你可以定义一个元组,它是一个固定大小的数组,里面有任何东西。它也是不可变的和有序的。但是,它只是一个好的老数组,语言不会让你改变它的。
  • Records。如果你曾经学过C语言,这就是你的结构。如果你曾经做过Javascript,那么这就是你的对象字面。经过测试,你甚至可以给记录的属性分配函数。
  • Variants。JavaScript没有Enum的概念,但是如果你尝试过其他语言(甚至是TypeScript),你就会看到它们。它只是一个常量组的列表。这就是Variants,另外一个例外是它的属性可以接收参数。比如说:

image.png

在上面可以看到如何比较两个分配了相同枚举值的变量,然而由于它们收到了不同的参数(第6行和第7行),那么它们就不会相同。另一方面,如果你把val1和val2重新分配为NoValue,那么IF条件就会变成真。

这并是一个革命性的概念。

  • Lazy valueLazy value 是一个代码块,你可以让它变得 "懒惰",因此你声明它,但它不会执行,直到你强迫它执行。当它最终执行时,它也会被缓存起来,所以下次你运行它时,它将返回缓存的值。老实说,这就是一个备忘函数,这就是它的全部内容。当然,有原生的记忆化功能是很好的,但话说回来,这并不是一个多么复杂的话题。

不好的部分

除了新语言的闪亮的外表之外,RS也有一些不好的地方。

在对该语言进行短期测试时发现的不好的部分:

  • 推断类型意味着没有 "真实 "的值。在RS中,你需要确保你在IF语句中使用的表达式是一个布尔值。
  • 错误信息并不那么好。如果希望人们使用你的语言,错误信息就必须清晰易懂。你认为下面这个错误信息是什么意思?

这个错误信息并不清晰,因为。

  1. 测试时并没有在那个地方写过一行代码。
  2. 它指的是什么论据,代码有好几个。

这个问题的答案是:测试者用let来定义Enum,而不是用type关键字。 很显然,这不是开发者所期待看到的错误信息。

看看下一个问题:

这是测试者最后一次尝试从Node.js导入fs模块。错误信息写着 "index out of bounds",什么原因呢?

相信精通ReScript之后一定能理解这个错误,但这不是一个好的开发者体验,它阻碍了采用。

ReScript会成为新的标准吗?

这个问题很难说。RS其实并不是一个新项目。该语言目前是9.1版本,它的官网也非常详细。

然而,在9.1版本中仍然存在这些问题,似乎意味着并没有很多人在使用它或关心它,来报告或帮助解决这些问题。

ReScript的一些想法很有趣,无疑提供了一些前进的方向,然而,在与TypeScript相抗衡之前,该团队仍有许多地方需要改进。

你以前尝试过ReScript吗?现在你读到了关于它的报道,你会选择尝试吗?你还见过哪些其他类型的Javascript?

原文链接:blog.bitsrc.io/yet-another…