TypeScript 7.0 新機能詳解:Go による完全再設計で実現した 10 倍高速なコンパイラ

TypeScript · Release 7.0

TypeScript 7.0 新機能詳解:Go による完全再設計で実現した 10 倍高速なコンパイラ

typescriptTypeScriptリリースGo並列コンパイルパフォーマンス最適化

データソース:GitHub Releases + 官方博客 + HN

TypeScript 7.0 は、記念碑的なアーキテクチャ刷新を果たしたメジャーリリースです。本バージョンのコアテーマは「超高速と並行性」であり、コンパイラの基盤全体が従来の JavaScript から Go 言語へと完全に書き直されました。このリファクタリングにより、ネイティブコードレベルの実行速度と共有メモリによるマルチスレッド処理能力を獲得し、フルビルド時間は概ね 8〜12 倍高速化され、メモリ消費量も大幅に低減しました。本記事では、TypeScript 7.0 の中核となる新機能と、移行時に注意すべきポイントを詳しく解説します。

Go による全面刷新と飛躍的なパフォーマンス向上

TypeScript 7.0 における最も根本的な変化は、低レイヤーアーキテクチャの刷新です。長年にわたり、TypeScript は TypeScript/JavaScript 自身で記述されたセルフホスティング(Self-hosting)環境を維持してきました。しかし 7.0 において、Microsoft チームはコンパイラを極めて高い忠実度で Go 言語へとネイティブ移植しました。

この転換は、大規模プロジェクトにおける長年の性能ボトルネックを一挙に解消しました。VS Code や Sentry など多数の主要オープンソースプロジェクトを用いた公式ベンチマークでは、コンパイル時間が従来の数百秒から数十秒、さらには数秒へと激減し、平均で約 10 倍のパフォーマンス向上が実証されています。同時に、コンパイル工程全体を通じてメモリのピーク使用量も削減され、ローカル開発環境や CI パイプラインのコンピューティングリソースを大幅に節約します。

新たな並行制御とシングルスレッドモード

Go 言語が持つ並行処理の強みを活かし、TypeScript 7.0 は構文解析(パース)、型チェック、コード生成の各フェーズにおいて並列処理を実行できるようになりました。これに伴い、並列度をきめ細かく制御するための新しい CLI フラグが追加されています。

型チェックを担当する Worker スレッド数は --checkers フラグで制御可能です(デフォルト値は 4)。マルチコア CPU を搭載したマシンではこの値を増やすことでビルド時間をさらに短縮でき、リソースが制限された CI コンテナなどでは適度に低く抑えることができます。同様に、Project References を用いたマルチプロジェクト構成における並列ビルド数は --builders パラメータで制御できます。

また、トラブルシューティング時のデバッグや極限の制約環境での実行を想定し、新たに --singleThreaded フラグも提供されています。このフラグを有効にすると、すべての処理がシングルスレッドで順次実行されるようになります。

Watch モードにおける監視機構の再設計

日常の開発で --watch モードを常時稼働させているチームにとって、巨大な node_modules 依存ツリーを監視する際に生じる CPU ポーリングのオーバーヘッドは、旧バージョンにおける大きな課題でした。

TypeScript 7.0 では、Parcel バンドラーの基盤技術( @parcel/watcher)に着想を得た新しいファイル監視アーキテクチャが導入されました。そのコアロジックを Go に直接移植することで、C++ ビルドツールチェーンを導入することなく、極めて低負荷なクロスプラットフォームのファイル変更検知を実現しています。これにより、大規模なフロントエンドプロジェクトであってもミリ秒単位のホットリロード応答性を誇ります。

エコシステム互換性対策:TypeScript 6 エイリアスによる共存

TypeScript 7.0 ではコンパイラが完全に Go へ移行したため、現時点では従来提供されていたプログラム向けのコンパイラ API が外部に公開されていません(API は 7.1 において新たな形で再設計・提供される予定です)。そのため、typescript-eslint などの TypeScript API に強く依存する周辺エコシステムツールは、7.0 エンジンを直接呼び出すことができません。

この移行期間に対応するため、公式から Side-by-Side の共存ソリューションが提供されています。プロジェクト内で @typescript/typescript6 互換パッケージを導入することで、CLI ビルドやエディタの言語サービスには TS 7.0 を利用しつつ、API に依存するツール群は 6.0 エンジンへとフォールバックして稼働させることが可能です。

{
  "devDependencies": {
    "typescript": "npm:@typescript/typescript6@^6.0.2",
    "@typescript/native": "npm:typescript@^7.0.2"
  }
}

テンプレートリテラル型におけるネイティブ Unicode サポート

文字列の型推論を行う際、従来の TypeScript は JavaScript の標準的な UTF-16 コードユニットのインデックス挙動をそのまま踏襲していました。そのため、絵文字のようなサロゲートペア文字が中間で分割され、意図しない文字化けが発生する原因となっていました。TypeScript 7.0 では、テンプレートリテラル型が Unicode 文字をひとつの論理ユニットとして正しく保持するよう改善されました。

type HeadTail<S> = S extends `${infer Head}${infer Tail}` ? [Head, Tail] : never;

type Result = HeadTail<"😀abc">;
// 7.0 での推論結果: ["😀", "abc"]
// 以前のバージョンでの推論結果: ["\ud83d", "\ude00abc"]

この変更により、複雑な文字列に対する型レベルの操作が大幅にシンプルになり、実行時における for...of ループやスプレッド展開の挙動と完全に一致するようになりました。

JavaScript サポート仕様の調整と破壊的変更

TypeScript 7.0 では、JSDoc および通常の JavaScript ファイルに対する構文解析仕様も厳格化され、解析パフォーマンス向上のために一部の特殊なエッジケースが整理されました。例えば、@enum タグの特殊な挙動が廃止され、標準的な構文定義が必要となったほか、Closure Compiler スタイルの関数型注釈(例: function(string): void)が非推奨となり、TypeScript 標準のアロー関数構文 (s: string) => void の使用が必須となります。

さらに、7.0 ではより厳格なデフォルト設定が適用されます(6.0 で導入された新基準が、警告から完全なエラーへと格上げされました):

  • strict がデフォルトで有効になり、module の初期値は esnext となります。
  • rootDir はデフォルトで ./、types は [] となります(以前のように暗黙的にすべての型定義を読み込むことはなくなります)。
  • target: es5 のサポートが完全に廃止されました。
  • baseUrl および moduleResolution: node が完全に非推奨となりました。標準的なパスエイリアスと併せて nodenext または bundler モードを採用することが推奨されます。

アップグレードの指針

対象プロジェクトアップグレードの時期移行時のチェックポイント
純粋な TypeScript プロジェクト即時アップグレードtsconfig.json 内で非推奨となった baseUrl を削除する。ルート以外のソースコードに対して "rootDir": "./src" を明示する。必要に応じて "types": ["node"] を明記する。
JSDoc に依存する既存の JS プロジェクト様子見 / 慎重にアップグレード7.0 では JSDoc のパースが厳格化されているため、Closure 構文に依存している注釈をすべて標準の TS 記法へと書き直す必要がある。
Vue / Astro / Svelte フレームワーク開発延期またはハイブリッド運用内部 API に強く依存するテンプレートプラグインは、現時点でエディタ上で 7.0 に完全対応できていないため、7.1 を待つか前述の共存モードを利用する。
ライブラリ・ツールチェーンのメンテナ互換性の検証と適合パッケージが公開された typescript コンパイラ API に依存している場合は、ランタイムエラーを防ぐため、ユーザーに対して 6.0 エイリアスパッケージの導入を案内する。

参考リンク