6月18日、Microsoft DevBlogsが「Announcing TypeScript 7.0 RC」と題した記事を公開した。コンパイラの実装言語をTypeScriptからGo言語へ移植することで約10倍の高速化を実現したTypeScript 7.0のリリース候補(RC)についての詳細が紹介されている。
コンパイラのパフォーマンス問題はTypeScriptコミュニティが長年抱えてきた課題だ。大規模コードベースでのビルド時間や、エディタの型チェックレスポンスの遅さは開発体験を著しく損ねる。今回のGo移植はその根本解決を狙ったものであり、Microsoft内外の数百万行規模のコードベースですでに運用が確認されている。Bloomberg、Canva、Figma、Google、Slack、Notion、Vercelといった企業のチームがプレリリース版を試用し、ビルド時間の大幅な削減と軽快な編集体験を報告している。
TypeScriptがGoへ——「書き直し」ではなく「移植」である理由
TypeScript 7.0最大のニュースは、コンパイラの実装言語がTypeScript(JavaScriptにコンパイルされるブートストラップ構成)からGo言語へ移植されたことだ。これは2025年3月にTypeScript Native Previewとして発表されたプロジェクトの正式RC版にあたる。
TypeScriptのコンパイラはこれまでTypeScript自身で書かれており、Node.js上のJavaScriptとして動作していた。シングルスレッド・インタープリタ実行という構造上の限界から、大規模コードベースでのビルド時間やエディタのレスポンスに課題を抱えていた。Go移植によりネイティブコードの実行速度と共有メモリを使った並列処理が可能となり、TypeScript 7.0はTypeScript 6.0比でおよそ10倍高速になっている。
重要なのは「移植(port)」であって「書き直し(rewrite)」ではない点だ。Goのコードベースは既存実装を体系的に移植したものであり、型チェックのロジックはTypeScript 6.0と構造的に同一である。互換性と安定性が高い理由はここにある。
インストールは従来通りnpmから行える。
npm install -D typescript@rc
VSCodeで編集体験を試す場合は、TypeScript Native Preview拡張をインストールするだけでよい。Language Server Protocol(LSP)ベースで構築されているため、VSCode以外のモダンなエディタやCopilot CLIでも動作する。
並列処理の仕組みと設定
TypeScript 7.0ではパース、型チェック、エミット(出力ファイル生成)が並列実行される。
型チェックの並列化には特別な工夫がある。ファイル間の依存関係が複雑なため、単純に並列実行すると結果が変わりうる。これを避けるため、TypeScript 7.0は固定数の型チェッカーワーカーを起動し、同じ入力に対して常に同じファイル分割・同じ結果を保証する設計になっている。
型チェッカーの数はデフォルト4で、--checkersフラグで調整可能だ。大規模コードベースでは増やすと速くなる一方、メモリ使用量も増加する。CI環境など、リソースが限られる場合は減らすことが推奨される。
モノレポ向けには--buildersフラグも追加され、複数プロジェクトを同時ビルドできる。--checkers 4 --builders 4の組み合わせでは最大16の型チェッカーが同時稼働するため、バランスの調整が必要だ。デバッグや外部ビルドオーケストレーション用途向けに--singleThreadedフラグも用意されている。
--watchモードの刷新
--watchモードはParcelバンドラーのファイルウォッチャーをGoへ移植したものを基盤として再構築された。
当初はポーリング方式で実装していたが、node_modulesに大量の依存がある大規模プロジェクトではCPU負荷が高すぎて実用に耐えなかった。Visual Studio Codeが長年 @parcel/watcher を利用してきた実績に着目し、C++で書かれたParcelのウォッチャーをGoへ移植したところ、クロスプラットフォームで安定したファイル監視が実現できたという。
TypeScript 6.0との共存と移行
7.0 RCは事実上プロダクションレディだが、**typescriptパッケージをNode.jsライブラリとして直接importして利用するプログラマティックAPIは、少なくとも数か月後のTypeScript 7.1まで提供されない**。typescript-eslintなど、このAPIへの直接依存を前提とするツールが引き続き動作するよう、互換性パッケージ@typescript/typescript6が公開されている。
{
"devDependencies": {
"typescript": "npm:@typescript/typescript6@^6.0.0",
"typescript-7": "npm:typescript@rc"
}
}
npmエイリアスを活用することで、6.0(tsc6コマンド)と7.0(tscコマンド)を競合なく共存させられる。
デフォルト設定の変更点
TypeScript 7.0は6.0で導入された変更をベースとし、6.0で非推奨化されたオプションはハードエラーになる。特に影響が大きいのは以下の変更だ。
strictがデフォルトでtruemoduleのデフォルトがesnext- **
rootDirのデフォルトが./**(srcなどのサブディレクトリを使うプロジェクトは明示的な指定が必要) - **
typesのデフォルトが[]**(@types/nodeや@types/jestなども明示的なリストアップが必要) target: es5やmoduleResolution: node/node10など旧来のオプションが廃止
6.0からの移行を先に済ませておくと7.0への移行がスムーズになる。6.0の変更点の詳細はTypeScript 6.0リリースブログも参照されたい。
Unicode対応の改善
細かいが実用的な変更として、テンプレートリテラル型でのUnicodeコードポイントの扱いが修正された。
type HeadTail<S> = S extends `${infer Head}${infer Tail}` ? [Head, Tail] : never;
type Result = HeadTail<"😀abc">;
// 7.0: ["😀", "abc"]
// 以前: ["\ud83d", "\ude00abc"] ← サロゲートペアに分割されていた
以前はJavaScriptのUTF-16インデックス動作に従い、絵文字がサロゲートペアに分割されていた。7.0ではコードポイント単位で自然に扱われる。
詳細はAnnouncing TypeScript 7.0 RCを参照していただきたい。