TypeScriptのCIで型チェックを速くしたい
この記事は TSKaigi アドベントカレンダー 23 日目の記事です。
はじめに
これまでは CI にかかる時間をあまり意識していませんでしたが、社内で Biome を導入したことで Lint にかかる時間が大幅に短縮され、その効果を強く実感しました。Lint が爆速で終わることに感動を覚え CI の効率化に対する意識が高まりました。特に、TypeScript の型チェックに時間がかかっていることに気付き、これを改善できないかと考えるようになったのがこの記事を書くきっかけです。今回は型チェックに利用されている tsc について書いていこうと思います。
Biome
本題ではありませんが、Biome をご存じない方のために、簡単に説明しておきます。Biome は JavaScript、TypeScript、JSON、JSONC、CSS、GraphQL、etc…の Format と Lint をしてくれるツールです。Rust で書かれており従来のデファクトスタンダードなツールよりも非常に高速に動作します。ただ一方で手放しに乗り換えたらいいという状況でもなくまだ ESLint などのプラグインとの互換が十分じゃないなどの課題があります。
みんな大好き tsc について
tsc は、Microsoft 社が開発・メンテナンスする公式の TypeScript コンパイラです。tsc 自体には複数機能がありますがその中でも今回は型チェックについて取り上げようと思います。tsc は TypeScript 製であり、tsc と VS Code の両方を、ドッグフーディングのために TypeScript で書いているということらしい。(以下の動画で触れられています)tsc 開発の背景を考えると「そもそも Microsoft が Rust や C++などの高速に動作する言語 で書き直してくれる」という展望は、現時点ではかなり可能性が低いと考えられます。
現状 tsc に特に困っているということは個人的にはないのだけれど、Biome で Lint が一瞬で終わるあの感動を忘れられない…。一方 tsc は CI での型チェックにかなり時間がかかる…どうにかならないものかと代替案を考えてみたい。
tsc 代替案
stc
まず挙げられるのは stc かなと思います。作者は Rust 製のトランスパイラ swc の作者でもある @kdy1dev さんで tsc の TypeScript の型チェック部分のみを Rust で再実装しようとするプロジェクトです。著者もかなり前にメルカリのブログを読んでその存在を知りました。
しかし、今回記事を書くにあたり調べてみると、stc の開発はすでに終了しているようです。以下のような一言で締め括られていました。要は tsc の型チェックの機能は別の言語で書き直せるようなものじゃなかったらしい。悲しいですが stc は代替にはなりそうにないですね。
TypeScript was not something that I could follow up on in an alternative language.
TypeRunner
こちらは C++を使って tsc を置き換えようというプロジェクトです。とは言っても現状開発は事実上停止してますそもそも開発が正式にスタートしてない? かなり前にはなりますが資金調達を試みていたようですが、うまくいっていないようですね。ということで選択肢にはならなさそう…
Ezno
Rust 製のチェック、正確性、パフォーマンスを特徴とする JavaScript コンパイラです。
以下の Ezno の開発者のブログにこのようにあります。
Don't take Ezno's features as a knock on TypeScript, TypeScript is great. Ezno started as a pet project to reimplement the features of TSC in Rust. But as things started to go well after adding more and more TSC features, it was apparent that optimisations such as the hydration and the reactive systems weren't going to be possible directly following its path. It isn't possible to detect what can happen to the state when called through a term that represents any. TypeScript holes aren't particularly critical if you just want code completions and some basic errors to be caught. They allow the more complex parts to not be blocked by compiler errors. But for doing optimizations a single unknown result can make it impossible.
Ezno は完全な tsc 互換ではなさそうですし、tsc 互換を目指していないみたいですね。実際に試していないため精度や実用性については判断が難しく、今後の発展に期待したいところですが、型安全を担保できるだけの精度があるかをなにを持って示すかは難しそうですね…
結論
2024/12/23 現在は tsc の代替として型チェックを高速にできるようなツールと候補はなさそう。
まとめ
さて、簡単にですが Biome で体感した感動を型チェックにも存在しないかと調査をしてみました。結論としては 2024/12/23 現在、有力な代替ツールは見つからない状況です。そもそも調査していて気づいたのですが、型安全性を確保するための型チェックで不安定なツールを使うのは本末転倒になりかねない、と改めて感じました。😮💨
やはり現時点では tsc がデファクトスタンダードであり、それを別ツールに置き換える際のコストやリスクを考えると、得られる恩恵は小さいように感じます。ただ stc のような Rust や C++で書かれた型チェックをするツールが全く価値がないというわけではなく、それが十分に実現可能なら情熱を傾ける価値はあると思います。もし今後そんなツールが登場してきた際には自分も応援しようと思います!
Discussion