Tho*_*mas 53

现在有很多针对JavaScript的语言.选择其中一个取决于您的需求和您喜欢的习语.

JavaScript有一个动态类型系统.一些开发人员更喜欢静态的.

  • TypeScript或Haxe使用静态类型的新语言解决了这个问题,并且只转换为JavaScript.

  • Flow是一个JavaScript预处理器,它针对同一个问题但不需要学习新语言.如果你只需要一个类型系统,我更喜欢这种方法.

一些JS开发人员想要更多并使用更多的函数式编程习惯用法(代数数据结构,不变性,模式匹配......).很多编程语言都可以做到(OCaml,Haskell,ReasonML,F#,Scala,......).

  • ReasonML是OCaml的一种语法,可以通过BuckleScript编译为本机或JavaScript.除了ReasonML语法接受JSX之外,使用OCaml也可以实现使用Reason实现的所有功能.ReasonML可以轻松定位node.js应用程序,react.js应用程序或本机应用程序.

如果您来自Java或C#世界,TypeScript很容易学习.

如果您从未使用ML语言(OCaml或F#)开发,则ReasonML更难学习

我的建议:

  • 如果您只需要静态类型系统,则应考虑使用TypeScript

  • 如果你需要一个类型系统来做一个react.js或react-native app,你应该考虑ReasonML,因为ReasonReact是对react.js的巨大改进

  • 如果需要编译为js的函数式编程语言,则应考虑ReasonML

  • 并不是的.动态类型表示类型在运行时计算,而静态表示在编译时计算类型.强类型和松散(或弱)类型更具争议性.我喜欢这个定义https://youtu.be/UXBoiqRJ6DQ?t=5m6s (6认同)
  • @TomCumming都旨在键入JS,但Typescript是一种完整的语言 - 即使它是js的超集 - 而flow只是一个javascript预处理器.必须使用Typescript编译器(用Typescript编写)将TS代码编译为JS才能运行.带有Flow注释的JS应该由流程进行预处理(用OCaml编写),但它可以由babel运行(或转换),而不需要由流程进行预处理.关于推理引擎的一个很好的解读:https://codeburst.io/inference-engines-5-examples-with-typescript-flow-and-reason-edef2f4cf2d3 (3认同)

gle*_*nsl 36

有很多权衡取舍,其中许多源于ReasonML,技术上只是OCaml,因此继承了OCaml 25年历史的大部分设计决策,这些历史是一种原生编译的语言,很少考虑网络上这个奇怪的JavaScript利基.

但是我认为最大的权衡是ReasonML的声音和灵活类型系统之间的最大权衡,以及TypeScript能够轻松地将全面的静态检查"偷偷摸摸"到现有的JavaScript代码库中.

TypeScript的类型系统明确地设计为不是声音,因此虽然它会在大多数时间为您提供帮助,但它将无法为您提供许多保证.你真的不能完全信任类型系统让你的背部,这是拥有一个适当的静态类型系统的最大优势之一.

TypeScript也受限于避免运行时类型信息的决定,这对于模式匹配等功能是必需的,并且是在ReasonML中使用类型化数据的主要好处.

另一方面,ReasonML要求明确定义自身与现有JavaScript代码之间的边界.类型可以在某种程度上被推断,但它们仍然必须在编译时确定.这使得JavaScript互操作变得更加费力,尤其是当边界随着现有JavaScript代码库的转换而逐渐移动时.在JavaScript中输入一些奇怪的东西并不总是很明显,但它通常是可能的,并且希望只是暂时的,直到所有东西都被转换为ReasonML :)

显然我有偏见,但我希望这并不是因为选择一个明显的赢家,至少因为确实没有.这是一个重要的权衡,至少只要世界不完美.


小智 17

在大型应用程序中,您将需要许多功能,这些功能在ReasonML中默认提供:严格类型,运行时验证(如果编码/解码JSON),快速编译时间,不可变数据.

在TypeScript中,您必须添加:

  1. ImmutableJS +它的类型.
  2. 运行时验证器,如json-schema +其类型.然后,您必须在TypeScript中编写类型,并在json-schemas中定义模式.它们很快就会变得不同步.
  3. 如果变量是特定类型的话,有些疯狂的黑客可以区分(例如TS的官方文档:https://www.typescriptlang.org/docs/handbook/advanced-types.html,段落"用户定义的类型保护") .这种检查是使用像.swim!== undefined这样的副作用完成的.在6个月内,这个'if'语句将包含越来越多的检查.
  4. 如果您使用的软件包具有官方和维护类型定义,那么您很幸运.或者你最终会得到自定义类型.
  5. 如果您在JS + TS中开发混合应用程序,那么TS Compiler无法创建捆绑的最终d.ts文件,您可以在项目的其他部分导入该文件.您必须编写单独的d.ts文件,这些文件由dts-bundle等工具捆绑在一起.如果您拥有TS中的所有内容,则此问题不适用.
  6. 大型应用程序需要花费大量时间才能通过TypeScript进行编译.

使用ReasonML:

  1. 不可变数据在语言中.
  2. 存在运行时验证器(默认情况下bs-json有它们)
  3. 模式匹配可以帮助您避免这些疯狂的检查
  4. 如果您想要使用的npm包具有BuckleScript绑定,那么您很幸运.
  5. N/A.
  6. ReasonML编译速度非常快.

  • 尽管如此,*在语言*中使用它们和*将它们作为默认值*之间存在很大差异.默认情况下,Reason是不可变的. (5认同)
  • 如果你想在Typescript中实现不变性,那么ImmutableJS是没有必要的.只需使用'readonly'属性修饰符和类型,如ReadonlyArray,ReadonlyMap,Readonly等.所有这些都包含在语言及其标准库中. (4认同)
  • 您假设 OP 将要使用不可变数据。恕我直言,在使用 typescript 时,坚持 OOP 是一个更好的选择——所以当你需要状态管理时,像 mobx 或 mobx-state-tree 这样的东西更有意义。但是您只需使用本机 react.js api 就可以轻松绕过它。当您拥有多线程时,不变性是一种胜利。在星期三你不这样做,所以你也可以为你的应用程序数据使用 OOP。另外,您是否有任何基准确认 TS 对于大型应用程序很慢?到目前为止,我的任何生产应用程序都没有出现任何缓慢的情况。 (3认同)
  • 对我来说,第六点应该放在首位。过去在Scala项目中工作过,您会很快意识到替代方案的快速反馈循环。与竞争对手相比,ReasonML闪电般快。 (2认同)

wir*_*res 9

(只是一张纸条)

把所有实际方面放在一边;

ML系列语言基于称为System-F的类型理论,例如Purescript和Haskell也使用它.

打字稿缺乏如此完善的基础,而是使用了一个具有许多特殊位的新实验型系统(我甚至不确定它是否"正式化").

所以从表面上看,TS的方法似乎"实用",但它引入了必要的复杂性.系统F具有构成系统的少量规则,并且它非常通用,但更容易推理TS的"理论".少即是多.

此外,学习System-F的努力是相当永恒的,并转换为其他更强大的语言,如Purescript.


bas*_*rat 5

这是非常不同的.

  • ReasonML是一种与JavaScript不同的语言,可编译为JavaScript
  • TypeScript是JavaScript的严格超集,可编译为JavaScript

如果你想编写类型安全代码,两者都是很好的选择.

  • 如果要编写类型安全的JavaScript,则可以选择TypeScript.

  • 如果你想编写类型安全的一些编译成JavaScript的语言,那么ReasonML是众多选项之一.在一些语言中ReasonML的情况下OCAML.

更多

我的偏见:https://medium.com/@basarat/typescript-won-a4e0dfde4b08

  • 您的答案和意见没有提及原因更像是F#,联合类型不可变。原因与打字稿完全不同,它被认为是React的引擎。当前,很多Facebook前端代码都用ReasonML编写 (2认同)