ReasonML( https://reasonml.github.io/ )とTypeScript( https://www.typescriptlang.org/ )のトレードオフは何ですか?
JavaScriptをターゲットとする多くの言語が現在あります。どちらを選択するかは、ニーズと イディオム に応じて異なります。
JavaScriptには動的型システムがあります。一部の開発者は静的なものを好みます。
TypeScriptまたはHaxeは、静的に型付けされ、JavaScriptに変換するだけの新しい言語でこれを解決します。
フローは、同じ問題をターゲットとするJavaScriptプリプロセッサですが、新しい言語を学ぶ必要はありません。型システムのみが必要な場合は、このアプローチを好みます。
一部のJS開発者は、より多くの機能的プログラミングイディオム(代数的データ構造、不変性、パターンマッチングなど)を使用します。多くのプログラミング言語で実行できます(OCaml、Haskell、ReasonML、F#、Scalaなど)。
TypeScriptは、JavaまたはC#の世界から来た人であれば簡単に習得できます。
ML言語(OCamlまたはF#)で開発したことがない場合、ReasonMLの学習は困難です。
私のアドバイス:
静的型システムだけが必要な場合は、TypeScriptを検討する必要があります
React.jsまたはreact-nativeアプリを実行するために型システムが必要な場合、ReasonReactはreact.jsよりも大幅に改善されているため、ReasonMLを検討する必要があります
Jsにコンパイルする関数型プログラミング言語が必要な場合は、ReasonMLを検討する必要があります
多くのトレードオフがありますが、その多くは技術的にはOCamlであるため、Web上のこの奇妙なJavaScriptニッチをほとんど考慮せずにネイティブにコンパイルされた言語であるというOCamlの25年の歴史からほとんどの設計決定を継承しているためです。
しかし、ReasonMLのサウンドと柔軟な型システムと、包括的な静的チェックを既存のJavaScriptコードベースに簡単に「忍び込ませる」TypeScriptの能力との間に最大のトレードオフがあると思います。
TypeScriptの型システムは、音が鳴らないように明示的に設計されているため、ほとんどの場合手に入れられますが、多くの保証を与えることはできません。型システムを完全に信頼することはできません。これは、適切な静的型システムを持つことの最大の利点の1つです。
TypeScriptは、ランタイムタイプ情報を回避するという決定によっても制限されます。これは、パターンマッチングなどの機能と、ReasonMLで型指定されたデータを操作する主な利点に必要です。
一方、ReasonMLでは、ReasonMLと既存のJavaScriptコードとの境界を明示的に定義する必要があります。型はある程度推測できますが、コンパイル時に決定する必要があります。これは、特に既存のJavaScriptコードベースが変換されるときに境界が徐々に移動する場合、JavaScriptの相互運用をより面倒にします。また、JavaScriptで行われる奇妙なものを入力する方法が常に明らかであるわけではありませんが、通常は可能ですが、とにかくすべてがReasonMLに変換されるまで一時的なものです:)
明らかに私は偏見がありますが、少なくとも実際にはそうではないので、明確な勝者を選ぶことにはならないことを願っています。少なくとも世界が完璧でない限り、これは大きなトレードオフです。
大規模なアプリケーションでは、ReasonMLでデフォルトで提供される多くの機能が必要になります。厳密な型、JSONをエンコード/デコードする場合のランタイム検証、高速コンパイル時間、不変データ。
TypeScriptでは、以下を追加する必要があります:
ReasonMLの場合:
(メモのみ)
すべての実用的な側面を脇に置きます。
ML言語ファミリはSystem-Fと呼ばれる型理論に基づいています。これは、たとえばPurescriptやHaskellでも使用されています。
TypeScriptにはこのような十分に確立された基盤がありません代わりに、多くの特別なビットを持つ新しい実験的な型システムを使用します(「形式化」されているかどうかはわかりません)。
そのため、表面的にはTSのアプローチは「実用的」に見えるかもしれませんが、必要以上に複雑になります。システムFにはシステムを構成する少数のルールがあり、非常に一般的ですが、そのTSの「理論」について推論するのは簡単です。少ないほうがいいですね。
また、System-Fの学習に費やされた努力は時代を超越しており、Purescriptなどの他のより強力な言語に変換されます。
これらは非常に異なります。
タイプセーフなコードを書きたい場合は、両方とも優れた選択肢です。
タイプセーフJavaScriptを記述したい場合、TypeScriptがオプションです。
タイプセーフでJavaScriptにコンパイルされる言語を作成する場合、ReasonMLは多くのオプションの1つです。 ReasonMLの場合のいくつかの言語はOCAMLです。
私の偏った意見: https://medium.com/@basarat/TypeScript-won-a4e0dfde4b08
Reason MLには機能的なファーストスクールが付属しています。もしあなたがそのような考えを持っているなら、それがGoへの道です。一方、TypeScriptはfpを実行でき、コミュニティサポートも良好です。ほぼすべての一般的なライブラリにはTypeScriptの型付けがあります。 fpts( https://github.com/gcanti/fp-ts/blob/master/README.md )を使用することを好みます。 TypeScriptのfpのすべての長所が提供され、ランタイムチェックも含まれます。 tsでは、型コンストラクタは大きなミスです。あなたがそれと一緒に暮らすことができるなら、tsを選んでください。