Remove TypeScript

経緯

world.hey.com

DHHが「オタクくん見てる〜? 今からうちのレポジトリからTypeScriptを剥しま〜す」と宣言したことにより、Web開発者界隈でTypeScriptの是非自体の話になり騒ぎになった*1*2

github.com

その後、野次馬がたくさん集ってきてrevertプルリクエストを立てる人やTypeScript公式リポジトリから全ソースコードを消すプルリクエストを出す*3ようなキッズムーブをする人も出てきた

world.hey.com

実際の変更

8617行のTypeScriptがJavaScript化された。(Sloc 便利)

❯ scc src/               
───────────────────────────────────────────────────────────────────────────────
Language                 Files     Lines   Blanks  Comments     Code Complexity
───────────────────────────────────────────────────────────────────────────────
TypeScript                  81     10934     2048       269     8617        986
HTML                        65      1891      138         2     1751          0
JavaScript                   3       170       17        23      130         29
CSS                          2         6        0         0        6          0
SVG                          1         1        0         0        1          0
TypeScript Typings           1        13        2         1       10          1
───────────────────────────────────────────────────────────────────────────────
Total                      153     13015     2205       295    10515       1016
❯ scc src/
───────────────────────────────────────────────────────────────────────────────
Language                 Files     Lines   Blanks  Comments     Code Complexity
───────────────────────────────────────────────────────────────────────────────
JavaScript                  81     10434     1983       272     8179        752
HTML                        65      1891      138         2     1751          0
CSS                          2         6        0         0        6          0
SVG                          1         1        0         0        1          0
───────────────────────────────────────────────────────────────────────────────
Total                      149     12332     2121       274     9937        752

典型的な変更は型注釈の削除。これを全ファイルに渡って行っている。

-  respondsToEventTarget(target: EventTarget | null) {
+  respondsToEventTarget(target) {
     const element = target instanceof Element ? target : target instanceof Node ? target.parentElement : null
     return element && element.closest("turbo-frame, html") == this.element
   }

Turboとは何か

TurboはRailsのviewでSPAを書くための仕組みです。https://turbo.build/とは別。

laiso.hatenablog.com

厳密には「サーバーサイドHTMLテンプレートベースでSPAを書くための仕組み」でRails以外にも適用できるのでGitHubのorgが独立して開発されている。

github.com

背景

「静的型付け言語と動的型付け言語はどちらが良いのか」という議論は今までにも各所で行なわれてきた。TypeScriptは静的型付け言語でJavaScriptやRubyは動的型付け言語に分類される。

typescriptbook.jp

DHHは(Ruby on Railsの作者だから当然)動的型付け言語の信仰者で、TypeScriptを好んでなくて利点を認めつつもあまり熱心ではないと普段から公言していた。

Rails誕生からの十数年を経て近年は型推論で静的型付けの記述量が軽減されたり、IDEや言語サーバーが賢くなったり、世間のプロジェクトが大規模複雑化してきたりしてもその部分はブレていないようだ。

world.hey.com

なのでTurboのレポジトリがTypeScriptだったのも「ライブラリはTypeScriptにするメリットがあるんだろうな」ぐらいに自分は感じていた。

実際、37signalsが作成するRailsアプリケーションのサンプルコードはいつもデフォルトJavaScriptで、彼等のプロダクトのコードもそうなんだろうと思う。

彼にとってTypeScriptが本来なくても充分に機能する複雑な抽象レイヤーという認識だったのかもしれませんね。

laiso.hatenablog.com

あと直接TypeScript書いてたコミッタの人は2021年のCEOブチ切れ事件の時にやめてる

techcrunch.com

誰に影響があるのか

Turboのコントリビューター

RailsのviewでSPAを書いていてTurbo本体にコントリビュートしたい時にJavaScriptコードで変更をしないといけなくなる人。

一方、RailsのviewでSPAを書いているアプリケーション開発l=Turboユーザー当事者はviewテンプレートと向きあったりwebpackやesbuildを通じたアセット管理をしているだけで、Turboのインターフェイスをコードから直接呼び出すようなことはない。

なのでTurboの中身がJavaScriptになったことでアプリケーション側ではひき続きTypeScriptで書くことができる(と言ってもTurboを使っている時に主に書くのはHTMLとRubyだが)

guides.rubyonrails.org

そもそもRailsのviewを使う機会が近年のチーム開発では減ってきていてそれを指して「Railsはオワコン」とか言われていたりする。

laiso.hatenablog.com

Rails以外でTurboを使えるようにしたい人

Turboを別のフレームワークに提供するためにプラグインを書いて、その時に@hotwired/turboの型定義を参考にする人。

自分の知っている中ではLaravel版があるけど彼等もJavaScriptで書いてる。

github.com

Railsエコシステム周りでTypeScriptやっていきたい人

37signals系のライブラリがTypeScriptを剥すのは既定路線で今から覆らなさそうなので、StimulusなどのRailsでかつフロント関係あるやつが全部JS化されて生きづらくなりそう。