フロントエンド開発の言語選定 (TypeScript vs FlowType)


目的

  • フロントエンド開発で、静的型付け言語の選定のための比較・判断材料。
  • めんどくさいので、メジャーな TypeScript と FlowType のみ比較する。
    • Scala.js とか PureScript とかもあるが、プロダクトコードで採用されることは稀であろう。
  • 「TypeScript も FlowType も使わない」みたいな原始生活は論外なので触れない。

比較表

調査実施日 : 2019-07-09

TypeScript FlowType
Development Corp. Microsoft Facebook
Current ver. 3.5.2 0.102.0
1st release date 2014-09-18 2014-11-19
Latest release date 2019-06-13 2019-06-25
Weekly DLs (npm) 5,694,392 455,270
Used by (GitHub) 1,295,137 64,764
Star (GitHub) 51,143 19,724
Contributors (GitHub) 394 636
Implemented lang TypeScript OCaml

Google Trends

補足

1st release

https://github.com/facebook/flow/releases?after=v0.2.0
https://github.com/microsoft/TypeScript/releases?after=v1.5.4

総評

FlowType を選ばない理由

  • Google Trends の結果が低い。
    • 「Flow」という単語を除外しているためフェアな比較になってない。
    • しかし、ググラビリティが低く無関係な結果まで含まれてしまうため、しょうがない。
    • このググラビリティの低さは、減点ポイントである。
  • ビルド・設定が複雑。
    • flow-typed のインストール、.flowconfig の設定、など。
  • ver が未だに 1 未満である。
    • https://semver.org/lang/ja/
    • > メジャーバージョンのゼロ(0.y.z)は初期段階の開発用です。いつでも、いかなる変更も起こりえます。この時のパブリック API は安定していると考えるべきではありません。
    • > またもし安定した API を持ち、それに依存しているユーザーが複数いるのなら、それは 1.0.0 であるべきでしょう。もし後方互換性について多大な心配をしているのなら、それは 1.0.0 であるべきでしょう。
      • 事実、後方互換がないことが多々ある。
      • 例えば、「今まで問題なかったコードが、アップデート後に型チェックエラー」「flowconfig のオプションがなくなった」など
      • 量が多いと対応しきれず、「アップデートできない」となってしまう。

TypeScript を選ばない理由

  • ビルド・設定が複雑化する。
    • Babel 7 (2018-08-28) 以前は、 TypeScript のビルドには ts-loader が必要
      • 例えば、 React 開発で create-react-app を使っていた場合、2.1.0 (2018-10-29) 以前で静的型付けをしたくば、下記 2 択だった。
        • eject して TypeScript を導入する
        • eject せず FlowType を使う
    • 今は、 create-react-app の eject なしで TypeScript を使用可能。
    • 自分でビルド組む場合も、Babel でトランスパイルできる。
      • → (FlowType より)ビルド・設定が複雑、とはならない。
  • (FlowType より)型推論が弱い
    • 逆に、明示的に型を書かせたい場合はこの方がよい。

結論

  • TypeScript を選ぶ