代表的な面接トピック

コーディング面接:TypeScript 7 ネイティブコンパイラへ安全に移行するにはどうすればよいか?

コーディング難しい
Offer.cc 編集チーム公開日 更新日

質問

TypeScript 6 のモノレポにおいて、CI の型チェックが遅く、TypeScript API に依存するツールが存在します。TypeScript 7 へ安全に移行するにはどうすればよいですか?

設問とコンテキスト

あなたのチームは、TypeScript 6 のモノレポで Web アプリケーションと共有パッケージを保守しています。CI の型チェックが遅すぎる上、リポジトリでは typescript-eslint、webpack loader、ならびに Vue および Angular のテンプレートツールが使用されています。TypeScript 7 のネイティブコンパイラを評価する必要があります。

TypeScript 6 の互換性レイヤーを維持し、CLI とエディタのアップグレードを計画し、並列チェックによるメモリリスクを制御し、カナリア、メトリクス、およびロールバックのゲートを定義する移行計画を設計してください。

面接官がテストしていること

  • tsc CLI、エディタの言語サービス、およびプログラムによる TypeScript API 依存関係を区別できているか。
  • バージョンの固定(ピン留め)、2 つのコンパイラ、および比較可能なアーティファクトによって移行リスクを低減できるか。
  • 並行性、メモリ、診断結果の差異、エコシステムの互換性を、実行可能なリリースの判定ゲートに落とし込めているか。
  • TypeScript 7 にまだ安定したプログラム用 API が存在しないことによって生じる境界を明確に提示できるか。

明確にすべき質問

  1. CI は tsc --build、隔離されたプロジェクト、またはカスタムコンパイラ API のいずれを使用していますか?
  2. どのツールが typescript を直接インポートしており、どのツールが宣言ファイルや CLI の出力のみを読み取っていますか?
  3. TypeScript 6 で stableTypeOrdering が有効になっており、宣言、診断、ビルド時間のベースラインは存在しますか?
  4. エディタのバージョン、Node のメモリ制限、および CI ランナーの CPU/メモリは固定されていますか?

30秒の回答

まず、すべての TypeScript API コンシューマを棚卸しし、バージョンを固定してロックファイルを使用しながら、TypeScript 6 互換性パッケージと並行して TypeScript 7 CLI をインストールします。CI では、宣言、診断、生成された JavaScript、ソースマップ、テスト、リソース使用量を比較し、まず TypeScript 6 側で stableTypeOrdering を有効にします。TypeScript 7 の --checkers--builders はベースラインからのみ引き上げ、--singleThreaded を診断用スイッチとして保持します。安定した API パスを持たない Vue、MDX、Astro、Svelte、Angular のツールは TypeScript 6 のまま維持します。導入範囲を広げる前に、カナリアリリース、段階的なエディタ展開、および明示的なバージョン管理されたロールバックを利用します。

ステップごとの詳細解説

コンパイラと API の依存関係を棚卸しする

Node、パッケージマネージャ、TypeScript、tsconfig、プロジェクト参照、ローダー、プラグイン、エディタのバージョンを記録します。コンシューマを CLI、宣言/生成アーティファクト、言語サービス、またはプログラム用 API に分類します。プログラム用 API の利用者には個別の互換性チェックが必要です。

TypeScript 7 と TypeScript 6 を並行してインストールする

TypeScript 7 は現在ネイティブコンパイラを提供していますが、安定した API は提供していません。tsc で 7 を使用する一方で、npm エイリアスを使用して tsc6 を保持します。

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

検証に合格したバージョンをピン留めし、ロックファイルをコミットします。パッケージマネージャのフラット化によって誤ったコンパイラが暗黙的に選択されないよう、スクリプトは各バイナリを明示的に呼び出す必要があります。

比較可能なアーティファクトのベースラインを確立する

まず TypeScript 6 で stableTypeOrdering を有効にし、その後 .d.ts、診断、生成された JavaScript、ソースマップ、インクリメンタルキャッシュ、テスト結果を保存します。順序の変更、真の型エラー、ツールのフォーマットの違いを切り分け、説明可能で API 的に安全な変更のみを許可リスト(allowlist)に含めます。

チェッカーとビルダーの並行性を調整する

TypeScript 7 はデフォルトで 4 つのチェッカーワーカーを使用し、ビルダーも並行して実行できます。並行性を高める前に、固定された CPU、メモリ、プロジェクト順序で測定してください。ウォールクロック時間、ピーク RSS、GC、リトライを記録し、ランナーのメモリ予算を超えた場合はロールバックします。非決定性を再現するために --singleThreaded を使用し、CI では固定のワーカー数を維持します。

エコシステムツールの隔離とエディタの展開

安定したプログラム用 API が登場する前に、テンプレートツールのアップグレードを強制しないでください。Vue、MDX、Astro、Svelte、Angular のツールは引き続き TypeScript 6 の API に依存している可能性があるため、tsc6 を利用させるか、個別の TS6 言語サービスを維持します。まず小規模な開発者チャネル向けに対応するエディタ拡張機能を有効にし、補完、ナビゲーション、診断、クラッシュ率を観察します。

カナリア、メトリクス、およびロールバック

リスクの低いパッケージと 1 つの CI カナリアから開始します。ビルド時間、診断の差異、宣言の互換性、ピークメモリ、エディタのエラー、テスト合格率を比較します。障害が発生した場合は、古いロックファイル、スクリプト、TS6 エディタチャネルを復元します。TS7 パッケージのみを削除すると、不整合なローダーが残る可能性があります。すべてのゲートを繰り返し通過した後にのみ、他のワークスペースへ展開を広げます。

模範解答

TypeScript 7 の価値はネイティブコンパイラと高速な CLI にありますが、API のコンシューマが移行の境界線を定義します。私は 2 トラックの計画を実行します。CLI 作業には TS7 を、互換性には TS6 を使用します。両方のバージョンをピン留めし、tsctsc6 を公開して、プログラム用 API への依存度に応じてローダー、テンプレートツール、エディタをルーティングします。まず stableTypeOrdering を有効にし、宣言、診断、生成されたアーティファクト、ソースマップ、テスト、リソース使用量を比較します。固定ランナーに対して並行設定を調整し、再現には --singleThreaded を使用します。カナリアと段階的なエディタ導入によって展開を拡大し、診断の回帰、宣言の破損、メモリ超過、エディタの障害が発生した場合はロールバックをトリガーします。TypeScript 7 にはまだ安定したプログラム用 API がないため、エコシステムツールの検証が完了するまで TS6 を保持します。

よくある間違い

  • その API をインポートしているローダー、プラグイン、テンプレートツールを確認せずに typescript のバージョンを置き換えてしまう。
  • リポジトリのベースラインやメモリ予算を持たずに、すべての高速化をネイティブコンパイラのおかげだとしてしまう。
  • stableTypeOrdering を有効にすることなく、宣言順序の変更を型の回帰として扱ってしまう。
  • ランナーのメモリやリトライの挙動を無視して CI の並行性を最大化してしまう。
  • CLI が動作するからといって、エディタやプログラム用 API も互換性があると想定してしまう。
  • ロックファイル、スクリプト、エディタのバージョンを保持せずに、口頭だけで「TS7 のアンインストール」というロールバックを計画してしまう。

フォローアップの質問

ローダーが TypeScript 6 の API に依存している場合、CI のみアップグレードできますか?

はい。まず型チェックのカナリアのみをアップグレードし、ローダーは tsc6 または TypeScript 6 API 上に維持し、ローダーをアップグレードする前に生成されたアーティファクトと宣言を検証します。

--checkers の値は常に大きい方が良いですか?

いいえ。CPU、メモリ、プロジェクトグラフ、GC のすべてが影響します。固定ランナーでのウォールクロック時間とピーク RSS に基づいて選択し、フォールバックとしてより小さな値を保持してください。

TypeScript 6 はいつ削除できますか?

すべてのプログラム用 API コンシューマ、テンプレートツール、エディタ、ビルドプラグインが互換性検証に合格し、カナリアメトリクスがゲート内に収まった後です。TypeScript 7 に安定した API が提供された時点で互換性レイヤーを再評価してください。

型の結果が変化していないことをどのように証明しますか?

診断、宣言、生成された JavaScript、ソースマップ、テストを比較し、順序やフォーマットの違いを分類します。終了コードの一致だけでは不十分です。

公開情報ソース

関連する質問

関連面接ツール

コーディング問題にはスクリーンショットを使用

問題をキャプチャし、制約条件、解法アプローチ、コード、エッジケース、計算量の順に進めます。

ツールを見る