TypeScript 7の新しいGoベースのコンパイラであるtsgoは、ESLint、ts-jest、ts-morphといった主要な開発ツールにすでに影響を及ぼしています。この問題は、次期リリースである7.1でコンパイラのプログラム用APIが安定するまで続く見込みです。そのため、これらのツールに依存しているチームは、アップグレード計画を一時停止すべきです。

TypeScript 7で何が変わったのか

このリリースでは、TypeScriptチームが「Project Corsa」とコードネームを付けていた、型チェッカーのGoポートであるtsgoが導入されました。コアをJavaScriptからGoに移行することで、コンパイラは最大10倍高速なビルドを実現できるようになりました。これは、CIパイプラインの時間を短縮したいと考えているアーリーアダプターにとって、非常に魅力的な謳い文句です。

なぜツールが失敗するのか

TypeScriptと連携するツールは、型チェッカーと直接通信しているわけではありません。型情報、診断、ASTのトラバーサル(走査)を公開する一連の内部APIを呼び出しています。これらのAPIはtsgo向けに書き直されており、バージョン7.1まで流動的な状態にあります。その結果、クラッシュやサイレントな失敗が連鎖的に発生しています。

  • typescript-eslint – npmがTypeScript 7との同時インストールを拒否します。強制的にインストールすると、ESLintがTypeErrorをスローします。
  • ts-jest – Go版には存在しない内部メソッドを呼び出そうとするため、テストファイルの変換が中断されます。
  • ts-morph – コード構造を走査するために安定したAPIを想定していますが、現在のAPIでは誤った結果を返したり、警告なしに失敗したりすることがあります。
  • Monorepos – tsgoは特定のジェネリック型パラメータを破棄するため、大規模なマルチパッケージプロジェクトでのみ発生する型エラーを引き起こします。

リンティング、Jestによるテスト、またはコード解析をTypeScript 7と組み合わせて使用するワークフローでは、ビルドが失敗(red builds)する可能性が高いでしょう。

影響を受ける対象

  • プルリクエストのたびにESLintを実行するフロントエンドチーム。
  • ユニットテストにts-jestを使用しているバックエンドサービス。
  • コード生成やドキュメント作成にts-morphを使用しているライブラリ。
  • 型推論がすでに複雑なモノレポ構成を採用している組織。

TypeScriptのアップグレード後にCIパイプラインが赤くなった場合、原因はおそらく上記のいずれかです。

7.1までの安全な移行パス

ツールを壊さずにスピードの恩恵を受ける最も簡単な方法は、高速な型チェックのステップと実際のビルドを切り離すことです。

  1. メインのTypeScriptバージョンを6.xに固定する – これにより、すべてのツールが想定している安定したAPIが維持されます。
  2. @typescript/native-previewをdevDependencyとして追加する – このパッケージには、CIでの高速な型チェック用のtsgoバイナリが含まれています。
  3. 高速チェックにはtsgo --noEmitを実行する – 型の検証は行いますが、出力ファイルは生成しません。
  4. 実際のビルドには従来のtscコンパイラを使用するtscは引き続きJavaScriptを生成し、6.xのAPIを尊重します。
npm install -D typescript@^6.9
npm install -D @typescript/native-preview

package.jsonのスクリプトを更新します:

{
  "scripts": {
    "typecheck:fast": "tsgo --noEmit",
    "build": "tsc"
  }
}

このデュアル構成により、ESLint、ts-jest、ts-morphとの互換性を維持しながら、CIにおける10倍のスピードアップを享受できます。

直接7.0にアップグレードできるケース

コードベースでtscのみを呼び出しており、リンティング、Jest、ts-morphを一切使用していない場合は、不安定なAPIの影響を受けません。そのような限定的なシナリオであれば、すぐにTypeScript 7に移行し、追加の手順なしでパフォーマンス向上を享受できます。

注意すべき点

  • バージョン 7.1 – TypeScriptチームは、このリリースでプログラム用APIが固定(freeze)されることを示唆しています。リリースされれば、tsgoと既存ツール間のブリッジが不要になり、クリーンなアップグレードが可能になります。
  • ツールのアップデートtypescript-eslintts-jestts-morphの新しいリリースに注意してください。7.1のリリース後まもなく、互換性のあるバージョンが公開される予定です。
  • CIの設定 – APIが安定したら、tsgo --noEmitを通常のtsc呼び出しに置き換えることを忘れないでください。プレビューパッケージは不要になります。

まとめ: 7.1でのAPI固定までは、メインのコンパイラはTypeScript 6.xのままにしておき、高速チェック用に@typescript/native-previewを追加し、ビルドには引き続きtscを使用してください。これにより、リンティングやテストの破損を避けつつ、新しいGoエンジンのパフォーマンスの恩恵を受けることができます。