2025年8月1日、開発者コミュニティが待ち望んでいたTypeScript 5.9が正式にリリースされました。

TypeScriptはJavaScriptに静的型定義を追加することで、コーディング時のミスを未然に防ぎ、エディタの強力な入力補完やリファクタリング機能を提供する言語です。

今回のアップデートでは、開発体験(DX)をさらに向上させるエディタ機能の強化や、最新のECMAScriptプロポーザルへの対応、そして次世代バージョンを見据えた重要な変更が含まれています。

本記事では、TypeScript 5.9で導入された主要な新機能や改善点、そして将来のロードマップについて詳しく解説します。

tsc –initの刷新と最小化

TypeScriptプロジェクトを開始する際、多くの開発者がtsc --initコマンドを使用してtsconfig.jsonを作成します。

これまでのバージョンでは、生成されるファイルに膨大な設定項目がコメントアウトされた状態で含まれており、初学者にとっては「どの設定が本当に必要なのか」を判断するのが難しいという課題がありました。

TypeScript 5.9では、この「tsc –init」で生成されるデフォルトのtsconfig.jsonが大幅に簡略化されました。

冗長なコメントが削除され、現代的な開発に推奨される設定項目が厳選して記述されるようになっています。

新しくなったtsconfig.jsonの例を以下に示します。

TypeScript
{
  // このファイルの詳細は https://aka.ms/tsconfig を参照してください
  "compilerOptions": {
    /* ファイルレイアウト */
    // "rootDir": "./src",
    // "outDir": "./dist",

    /* 環境設定 */
    "module": "nodenext",
    "target": "esnext",
    "types": [],

    /* その他の出力 */
    "sourceMap": true,
    "declaration": true,
    "declarationMap": true,

    /* 厳格な型チェックオプション */
    "noUncheckedIndexedAccess": true,
    "exactOptionalPropertyTypes": true,

    /* 推奨オプション */
    "strict": true,
    "jsx": "react-jsx",
    "verbatimModuleSyntax": true,
    "isolatedModules": true,
    "noUncheckedSideEffectImports": true,
    "moduleDetection": "force",
    "skipLibCheck": true
  }
}

今回の刷新では、単に項目を減らすだけでなく、「より安全で、モダンな開発環境」をデフォルトで提供することに重点が置かれています。

例えば、targetesnextに、modulenodenextに設定されることで、最新のランタイム機能を即座に利用できるようになります。

また、noUncheckedIndexedAccessのような、配列アクセス時の安全性を高めるオプションがデフォルトで提案されるようになった点も、品質向上に大きく寄与するでしょう。

新機能「import defer」のサポート

TypeScript 5.9における最も注目すべき言語機能の一つが、「import defer」構文のサポートです。

これはECMAScriptの「Deferred Module Evaluation」プロポーザルに基づくもので、モジュールの評価(実行)を必要になるまで遅延させることができます。

通常のimportでは、ファイルが読み込まれた瞬間にそのモジュール内のコードが実行されます。

しかし、import deferを使用すると、インポートした変数や関数に実際にアクセスするまでモジュールの実行を待機させることが可能です。

基本的な使い方

import deferは、名前空間インポート(namespace import)の形式でのみ使用可能です。

TypeScript
// インポートした時点ではモジュールは実行されない
import defer * as heavyModule from "./heavy-processing.js";

function onClickButton() {
  // ここでプロパティにアクセスした瞬間に、heavy-processing.jsが実行される
  heavyModule.startComplexTask();
}

この機能は、初期起動時の負荷を軽減したい場合や、特定の条件下でしか使用しない重いモジュールの読み込みを最適化したい場合に非常に有効です。

ただし、名前付きインポート(named import)やデフォルトインポートには対応していない点に注意が必要です。

また、この構文はTypeScriptによって古いJavaScript形式へダウンレベルコンパイルされることはありません。

ネイティブでサポートするランタイム、または対応するバンドラーを使用している環境での利用が想定されています。

–module node20 の導入

Node.js環境での開発をサポートするため、TypeScriptにはこれまでもnodenextなどのオプションが用意されていました。

5.9では、新たに「–module node20」設定が追加されました。

nodenextは常に最新の挙動を追従するため、TypeScriptのバージョンアップに伴い挙動が変化する可能性があります。

対して、新しく追加されたnode20は、Node.js v20の挙動に固定された安定的なオプションです。

設定項目デフォルトの挙動安定性
–module node20targetは es2023高い (挙動が固定される)
–module nodenexttargetは esnext低い (常に最新を追従)

プロジェクトの長期的な安定性を重視する場合、今後はnode20を明示的に指定することが推奨されます。

エディタ体験の向上:ホバー情報の拡張とカスタマイズ

開発者が毎日触れるエディタの「ホバー(ツールチップ)」機能にも、大きな改善が加えられました。

展開可能なホバー(プレビュー)

複雑な型定義を扱っているとき、マウスをホバーしても「type Options = …」といった短い情報しか表示されず、定義元までジャンプしなければ内容が確認できないことがありました。

TypeScript 5.9では、ホバー内の型情報を「+」ボタンで展開できる機能がプレビューとして導入されました。

これにより、関数の引数などの型を、エディタ上で詳細までドリルダウンして確認できるようになります。

VS Codeなどの対応するエディタを使用することで、開発フローを止めることなく複雑なオブジェクト構造を把握できるでしょう。

ホバーの最大文字数のカスタマイズ

これまで、あまりに長い型情報は可読性のために途中で切り捨て(省略)されていました。

しかし、重要な情報が省略部分に含まれてしまうという不満の声もありました。

5.9からは、ホバー情報の最大表示長をユーザー設定で変更可能になりました。

VS Codeでは、js/ts.hover.maximumLength設定からこの長さを変更できます。

また、デフォルト値自体も従来より大幅に引き上げられており、標準設定のままでもより多くの情報を確認できるようになっています。

DOM APIにおける説明文の追加

これまで、多くのDOM APIの型定義にはMDNへのリンクが含まれているのみでした。

TypeScript 5.9からは、APIの概要を説明する短いサマリーテキストがホバー情報に含まれるようになりました。

これにより、「このメソッドは何をするものだったか」を確認するためにブラウザを開く手間が減り、IDE内での自己完結的なコーディングが可能になります。

内部的な最適化によるパフォーマンス向上

コンパイル速度の向上も、今回のリリースの重要な側面です。

型インスタンス化のキャッシュ

複雑な型計算を行うライブラリ(ZodやtRPCなど)を使用しているプロジェクトでは、同じ中間的な型が何度も生成され、メモリ使用量や処理時間の増大を招くことがありました。

5.9では、マッパー上のインスタンス化処理をキャッシュすることで、不必要な再計算を回避しています。

これにより、特に大規模な型定義を扱う環境でのコンパイル効率が改善されました。

ファイル存在チェックの高速化

ファイルシステムの存在確認など、低レイヤーの処理において不要なクロージャ(関数)生成を削減する最適化が行われました。

特定の条件下では約11%の高速化が確認されており、ファイル数が多い大規模なプロジェクトほど、その恩恵を実感しやすくなっています。

破壊的変更と行動の変化への対応

TypeScript 5.9では、型定義の厳格化に伴ういくつかの変更点があります。

既存のコードベースをアップデートする際は、以下の点に注意してください。

ArrayBufferとTypedArrayの関係性の変更

lib.d.ts の更新により、ArrayBufferがいくつかのTypedArray(Uint8Arrayなど)のスーパータイプとして扱われなくなりました。

これに伴い、以下のようなエラーが発生する可能性があります。

TypeScript
let data = new Uint8Array([0, 1, 2, 3]);

// エラー例
// Argument of type 'Uint8Array' is not assignable to parameter of type 'ArrayBuffer'.

この問題を解決するには、Node.js環境であれば@types/nodeを最新版に更新するか、明示的に data.buffer を渡すようにコードを修正する必要があります。

型引数の推論精度の向上

推論中に型変数が「リーク」する問題を修正した結果、これまで通っていたコードで新たに型エラーが発生する場合があります。

この場合は、ジェネリック関数の呼び出し時に型引数を明示的に渡すことで解決できます。

TypeScript 6.0および7.0への展望

TypeScript 5.9のリリースに伴い、次期バージョン以降のロードマップについても触れられています。

現在、開発チームはTypeScriptのネイティブポート(Rust等による再実装)を並行して進めており、これが将来的にTypeScript 7.0として結実する予定です。

これに先立ち、次期バージョンのTypeScript 6.0は、7.0への移行をスムーズにするための「準備期間」として位置づけられます。

6.0では古い設定の非推奨化や、細かなチェック挙動の調整が行われる予定です。

5.9は、この大きな変革の前にある、現在のアーキテクチャにおける完成形のひとつと言えるでしょう。

まとめ

TypeScript 5.9は、派手な新機能の追加こそ控えめですが、実務での開発効率を確実に引き上げる堅実なアップデートとなっています。

  • tsc –initの刷新:モダンな推奨設定からプロジェクトを開始可能に。
  • import deferの追加:モジュール実行の遅延評価により、アプリの起動速度を最適化。
  • エディタ機能の強化:展開可能なホバーやDOM APIの説明文により、DXが向上。
  • パフォーマンスの最適化:型計算のキャッシュや内部処理の改善により、大規模プロジェクトのビルドを高速化。

特に、次世代のTypeScript 7.0に向けた土台作りが始まっている今、最新の5.9へアップデートし、モダンな設定(node20設定や厳格な型チェック)に慣れておくことは、将来的な移行コストを抑える上でも非常に重要です。

ぜひ、お手元のプロジェクトで npm install -D typescript を実行し、進化したTypeScriptの機能を体験してみてください。