6月21日、jatniel.devが「TypeScript 7 RC: the compiler rewritten in Go, around 10x faster」と題した記事を公開した。この記事では、TypeScript 7のリリース候補(RC)においてコンパイラがGoで書き直され、ビルド速度が最大約10倍に向上したことが詳しく紹介されている。
コンパイラをGoで書き直した、それだけで10倍速い
TypeScript 7の核心は新しい構文でも設定フラグでもない。コンパイラ全体がGoで書き直されたという一点に尽きる。
TypeScriptはJavaScript開発における事実上の標準として採用されており、Figma、Slack、Notionといった大規模プロダクトでも中核を担う。しかしコードベースが巨大になるほどビルド時間やエディタの応答遅延が問題になっており、これはJavaScript上で動くコンパイラの構造的な限界でもあった。従来のコンパイラはNode.js上で動作するシングルスレッドのJavaScriptとして実装されており、V8のJIT最適化に依存しながらも並列処理が本質的に苦手という制約を抱えていた。Microsoftはこの問題を「言語を変える」という根本的なアプローチで解決した。
Microsoftはこの1年間、従来のTypeScriptコンパイラ(TypeScriptで書かれJavaScriptにコンパイルされていた)をGoへ移植した。スクラッチからの再実装ではなく、既存の実装から忠実に移植されたため、型チェックのロジックはTypeScript 6と構造的に同一だ。書き方は変わらない。ただ速くなる。
速度向上の理由はシンプルで、Goがネイティブコードにコンパイルされ、共有メモリによる並列処理を活かせる点にある。Microsoftが報告する数字は「ビルドがTypeScript 6比でおよそ10倍速い」だ。この数字はMicrosoftの計測だけでなく、1年以上プレリリース版をテストしてきたFigma、Bloomberg、Vercel、Notion、Slackも同様の結果を報告している。
恩恵はビルドだけに留まらない。エディタ上でのオートコンプリート、型ホバー、リアルタイムエラー表示を担うLanguage Server Protocol(LSP)も同じ基盤で動く。大規模プロジェクトで日常的に感じる「エディタのもたつき」が改善されるのは、多くの開発者にとって体感しやすい変化だ。
ソースコードはApache 2.0でオープンソース公開されており、GitHubで2万5000以上のスターを獲得済みだ(コードの約85%がGo)。
TypeScript 6を飛ばしてはいけない
TypeScript 7はTypeScript 6のデフォルト設定を引き継ぐ。6で非推奨になっていたものは、7ではハードエラーになる。
7へ移行する前に6へ移行し、警告をすべて解消しておくのが推奨順序だ。
7でハードエラーになる主な設定例:
target: es5moduleResolution: nodebaseUrlmodule: amd/umd/systemjs
デフォルトの変更も注意が必要だ。strictがtrue、moduleがesnextになる。特に見落としやすい2点として、**rootDirのデフォルトが./になる(./srcを指定し直す必要があるケースが多い)点と、typesのデフォルトが[]になる**点がある。後者は@typesパッケージ(@types/nodeなど)をtsconfig.jsonのtypesフィールドに明示的にリストアップしなければならないことを意味する。
6と7を並行運用する方法
typescript-eslintのようにtypescriptパッケージを直接importするツールとの互換性は、プログラマティックAPIの安定版が提供されるTypeScript 7.1(数か月後の予定)までは完全には揃わない。
Microsoftはこの問題に対応するため、互換パッケージ@typescript/typescript6を用意した。package.jsonでnpmエイリアスを使うことで、6と7を干渉させずに共存させられる。
{
"devDependencies": {
"typescript": "npm:@typescript/typescript6@^6.0.0",
"typescript-7": "npm:typescript@rc"
}
}
リンターが参照するtypescriptパッケージは実態として6を向き、npx tscは7を使う構成だ。
並列化の仕組みと新しいオプション
TypeScript 7はパース、型チェック、出力を並列化する。ファイル間の依存関係がある型チェックは、固定数のワーカーが決定論的に分担する(「決定論的」とはつまり、同じ入力ファイルを与えれば常に同じ結果が得られるということで、並列化による非再現バグが起きにくい設計になっている)。
デフォルトは4ワーカーで、--checkersオプションで変更可能だ。コアが多いマシンでは増やせるが、メモリ消費も増える。CI環境が貧弱な場合は減らすとよい。
モノレポ向けに**--builders**オプションで複数プロジェクトの並行ビルドも可能だが、--checkers 4 --builders 4の組み合わせでは最大16の型チェッカーが同時起動する点には注意が必要だ。デバッグや6との比較検証には--singleThreadedでシングルスレッド強制もできる。
ウォッチモードはParcelのファイルウォッチャー(Go移植版)で刷新された。node_modulesの大量ファイルに対するポーリングがなくなり、ファイル監視のコストが大幅に下がっている。
今すぐ試すには
RCのインストールはシンプルだ:
npm install -D typescript@rc
npx tsc --version
# Version 7.0.1-rc
ナイトリービルドを試したい場合は別パッケージが用意されている:
npm install -D @typescript/native-preview
npx tsgo --version
ナイトリーのバイナリ名はまだtsgoだ。7の正式リリース後はtypescriptパッケージに統合される予定で、tsgoという名称は将来的にtscに統一される。
安定版は来月リリース予定とされており、バグ報告はmicrosoft/typescript-goリポジトリで受け付けている。公式アナウンスはAnnouncing TypeScript 7.0 RCで確認できる。
詳細はTypeScript 7 RC: the compiler rewritten in Go, around 10x fasterを参照していただきたい。