ReasonML (https://reasonml.github.io/) 和 TypeScript (https://www.typescriptlang.org/) 之间的折衷方案是什么?
ReasonML (https://reasonml.github.io/) 和 TypeScript (https://www.typescriptlang.org/) 之间的折衷方案是什么?
现在有很多编程语言都可以用来编写 JavaScript。选择哪一种取决于您的需要和您熟悉的习惯。
JavaScript 采用动态类型系统,而有些开发人员更喜欢静态类型系统。
TypeScript 或 Haxe 通过一个新的语言解决了这个问题,这个语言是静态类型的,并且只会被转译成 JavaScript。
Flow 是一个 JavaScript 预处理器,目的也是解决同样的问题,但无需学习一门新语言。如果你只需要一个类型系统,我建议采用这种方法。
一些 JS 开发者希望使用更多的函数式编程习惯(代数数据结构、不变性、模式匹配等)。许多编程语言都可以实现它(OCaml、Haskell、ReasonML、F#、Scala 等)。
如果你来自 Java 或 C# 的世界,TypeScript 很容易学习。
如果您没有使用过 ML 语言(OCaml 或 F#)进行开发,则 ReasonML 学习难度较大。
我的建议:
如果您只需要一个静态类型系统,请考虑 TypeScript
如果您需要一个类型系统来开发 react.js 或 react-native 应用程序,请考虑 ReasonML,因为 ReasonReact 比 react.js 更好
如果您需要一种编译成 js 的函数式编程语言,请考虑 ReasonML
有很多取舍,其中许多取决于 ReasonML 在技术上只是 OCaml,因此继承了 OCaml 25 年的历史,成为一个本地编译语言,对 Web 上这个奇怪的 JavaScript 领域几乎没有考虑。
但是我认为最大的取舍在于 ReasonML 的稳健而灵活的类型系统和 TypeScript 能够轻松“潜入”现有 JavaScript 代码库中进行全面的静态检查能力之间。
TypeScript 的类型系统明确设计为不稳健,因此虽然它会在大多数情况下为您提供帮助,但无法给您许多保证。您真的不能完全信任该类型系统来支持您,这是具有适当的静态类型系统的最大优势之一。
TypeScript 还受到避免运行时类型信息的限制,这对于功能(例如模式匹配)至关重要,并且是使用 ReasonML 中类型数据的主要好处。
另一方面,ReasonML 要求明确定义其与现有 JavaScript 代码之间的边界。可以在某种程度上推断出类型,但仍必须在编译时确定。这使得 JavaScript 互操作更加费力,特别是如果随着现有 JavaScript 代码库的转换,边界逐渐移动。还不总是清楚如何对一些奇怪的东西进行类型化,但通常是可能的,希望只是暂时的,直到所有内容都被转换为 ReasonML 为止 :)
显然,我有偏见,但我希望这不会表现出明确选择一个赢家,至少因为真的没有。这是一个重大的权衡,至少在世界不完美的情况下。
注:
撇开所有实际方面不谈;
ML语言家族基于一个类型理论,称为System-F,例如Purescript和Haskell也使用该类型理论。
相比之下,Typescript缺乏这样一个成熟的基础,而是采用了一个带有许多特殊位的新型实验性类型系统(我甚至不确定它是否“形式化”)。
因此,从表面上看,TS的方法可能似乎很“实用”,但它引入了更多不必要的复杂性。System F只有很少的规则构成系统,而且非常通用,比TS的“理论”更容易推理。简单就是美。
此外,学习System-F所花费的努力是相当具有时间性的,并且可以转化为其他更强大的语言,比如Purescript。
如果你注重函数式编程,那么Reason ML是一个很好的选择。而TypeScript也支持函数式编程,并且有着活跃的社区支持。几乎所有热门库都有TypeScript的类型定义文件。我个人更喜欢使用fpts(https://github.com/gcanti/fp-ts/blob/master/README.md)。它在TypeScript中提供了函数式编程的优点,并包括运行时检查。虽然在ts中缺少类型构造器,但如果您可以接受这一点,那么选择TypeScript也是不错的。