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までの安全な移行パス
ツールを壊さずにスピードの恩恵を受ける最も簡単な方法は、高速な型チェックのステップと実際のビルドを切り離すことです。
- メインのTypeScriptバージョンを6.xに固定する – これにより、すべてのツールが想定している安定したAPIが維持されます。
@typescript/native-previewをdevDependencyとして追加する – このパッケージには、CIでの高速な型チェック用のtsgoバイナリが含まれています。- 高速チェックには
tsgo --noEmitを実行する – 型の検証は行いますが、出力ファイルは生成しません。 - 実際のビルドには従来の
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-eslint、ts-jest、ts-morphの新しいリリースに注意してください。7.1のリリース後まもなく、互換性のあるバージョンが公開される予定です。 - CIの設定 – APIが安定したら、
tsgo --noEmitを通常のtsc呼び出しに置き換えることを忘れないでください。プレビューパッケージは不要になります。
まとめ: 7.1でのAPI固定までは、メインのコンパイラはTypeScript 6.xのままにしておき、高速チェック用に@typescript/native-previewを追加し、ビルドには引き続きtscを使用してください。これにより、リンティングやテストの破損を避けつつ、新しいGoエンジンのパフォーマンスの恩恵を受けることができます。
