2025年7月25日、TypeScript開発チームは次期マイナーアップデートとなるTypeScript 5.9のリリース候補 (RC) を発表しました。
今回のアップデートでは、開発者の利便性を大幅に向上させるimport deferの導入や、長年親しまれてきたtsc --initの刷新、さらにはエディタ上での情報表示 (Hover) の改善など、多岐にわたる機能追加と最適化が行われています。
本記事では、この最新バージョンにおける主要な変更点とその背景について、技術的な詳細を交えて詳しく解説します。
TypeScript 5.9 RCの概要と導入方法
TypeScript 5.9 RCは、正式リリース前の最終段階に位置するバージョンです。
ベータ版からのフィードバックを反映し、安定性を高めた状態となっています。
このバージョンをいち早く試すには、npmを使用してプロジェクトにインストールすることが可能です。
以下のコマンドを実行することで、開発環境にTypeScript 5.9 RCを導入できます。
npm install -D typescript@rc
今回のアップデートでは、言語仕様の拡張だけでなく、コンパイラ内部の最適化によるパフォーマンス向上や、DOM APIの型定義における説明文の充実など、開発体験 (DX) を底上げする細かな改善が多く含まれています。
tsc –initコマンドの刷新とデフォルト設定の変更
TypeScriptプロジェクトを開始する際、最初に実行するのがtsc --initコマンドです。
これまでは、このコマンドを実行すると膨大な数の設定項目がコメントアウトされた状態で出力されていました。
従来の課題と変更の背景
これまでの生成ファイルは、すべてのオプションを網羅することで「発見性」を高める狙いがありました。
しかし、多くの開発者は生成直後に不要なコメントを削除する手間をかけており、実際のオプション調査にはエディタの補完機能や公式サイトのリファレンスが利用される傾向にありました。
そこでTypeScript 5.9では、「最小限かつ推奨される設定」のみを出力するように刷新されました。
新しいtsconfig.jsonの構成
新しいtsc --initで生成される設定ファイルは、現代的な開発プラクティスに基づいた以下の項目が含まれます。
{
"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
}
}
特に注目すべきは、moduleDetection: "force"がデフォルトで含まれている点です。
これにより、すべてのファイルが独立したモジュールとして扱われ、グローバルスクリプトによる予期せぬ副作用を防ぐことができます。
また、targetがesnextに設定されたことで、最新のECMAScript機能をデフォルトで利用できるようになっています。
import deferによる遅延モジュール評価のサポート
TypeScript 5.9における最も注目すべき言語機能の一つが、ECMAScriptのプロポーザルであるimport deferへの対応です。
import deferとは何か
通常、JavaScriptのimport文は、モジュールがロードされた瞬間にその中身を実行します。
これに対し、import deferを使用すると、モジュールのロード自体は行われますが、実際の中身(文や宣言)の実行は、そのモジュールのプロパティに初めてアクセスするまで延期されます。
構文と制限事項
import deferは、現在の仕様では名前空間インポートのみをサポートしています。
// 名前空間インポートのみが許容される
import defer * as heavyModule from "./heavy-module.js";
// 以下のような名前付きインポートやデフォルトインポートはエラーとなります
// import defer { feature } from "./module.js"; ❌
実行タイミングの例
具体的な動作を確認してみましょう。
// ./side-effects.ts
console.log("モジュールが実行されました!");
export const data = 42;
// ./main.ts
import defer * as feature from "./side-effects.js";
console.log("まだ実行されていません");
// ここで初めてプロパティにアクセスする
console.log(feature.data);
上記コードを実行した場合の出力結果は以下の通りです。
まだ実行されていません
モジュールが実行されました!
42
このように、プロパティに触れるまで初期化コストを抑えられるため、起動パフォーマンスの改善や、重い初期化処理を伴うライブラリの条件付きロードに非常に有効です。
なお、この機能はランタイム側でのサポートが必要なため、現在は--module preserveまたはesnextモードでのみ動作します。
Node.js v20への対応と–module node20の追加
TypeScriptはこれまで、Node.jsの進化に合わせてnode16やnodenextといった設定を提供してきました。
TypeScript 5.9では、新たに–module node20および--moduleResolution node20が追加されました。
node20設定の特徴
この設定は、Node.js v20の挙動を安定してモデル化することを目的としています。
nodenextは常に最新の仕様を追いかけるため、将来的に挙動が変わる可能性がありますが、node20は特定のランタイムバージョンに固執した開発を行いたい場合に適しています。
また、node20を指定すると、デフォルトのターゲットがes2023として扱われます。
これにより、Node.js v20環境で確実に動作するコードを出力しやすくなります。
開発体験の向上:ホバー情報の拡張とDOM APIの改善
エディタ上での作業効率を高めるための機能改善も、TypeScript 5.9の重要な側面です。
拡張可能なホバー (Expandable Hovers)
VS Codeなどのエディタで変数や型にマウスを合わせた際に表示される「クイック情報」が、より深掘りできるようになりました。
これまでは、複雑な型定義(例えばOptionsという型名など)が表示されても、その内部構造を確認するには定義元へジャンプする必要がありました。
TypeScript 5.9では、ホバー内のツールチップに+および-ボタンが表示され、ツールチップ内で型をさらに展開して詳細を確認することが可能になります。
ホバーの最大文字数のカスタマイズ
また、非常に複雑な型を表示する際、これまでは情報の途中で省略 (Truncation) が発生してしまい、肝心の部分が見えないことがありました。
TypeScript 5.9では、VS Codeの設定項目としてjs/ts.hover.maximumLengthが追加され、省略されるまでの長さを任意に調整できるようになりました。
デフォルトの制限値も大幅に引き上げられており、標準設定のままでもより多くの情報を確認できるようになっています。
DOM APIのサマリー追加
DOM APIの型定義において、これまではMDNへのリンクのみが表示されるケースが多くありました。
今回の更新では、多くの主要なAPIに対してMDNに基づく概要説明 (Summary Description)がツールチップ内に直接表示されるようになり、ドキュメントをブラウザで開く手間が削減されました。
パフォーマンスの最適化
コンパイル速度の向上は、大規模プロジェクトにおいて死活問題です。
TypeScript 5.9では、内部構造の効率化が行われました。
型のインスタンス化キャッシュの改善
ZodやtRPCといった複雑な型推論を多用するライブラリでは、型引数の置き換え処理が頻繁に発生します。
TypeScript 5.9では、中間的な型のインスタンス化結果をキャッシュする仕組みが強化されました。
これにより、不要な再計算やメモリ割り当てが削減され、型チェックの高速化とメモリ消費の抑制が実現されています。
ファイル存在チェックの高速化
ファイルシステムへのアクセス周りでも、JavaScriptのクロージャ生成を抑制する微細な修正が行われました。
大規模なプロジェクトでは数千回、数万回のファイル存在チェックが行われるため、この最適化によってコンパイル全体の速度が約11%向上したという報告もあります。
破壊的変更と注意すべき挙動の変化
マイナーアップデートではありますが、一部の型定義の変更により、既存のコードでエラーが発生する可能性があります。
ArrayBufferとTypedArrayの互換性変更
lib.d.tsの更新により、ArrayBufferが各TypedArray(Uint8Arrayなど)の直接的なスーパータイプではなくなりました。
// 5.9以降でエラーになる可能性がある例
const buffer: ArrayBuffer = getUint8Array(); ❌
もしBuffer (Node.js) 関連の代入でエラーが出た場合は、@types/nodeを最新版に更新するか、より具体的な型(例:Uint8Array<ArrayBuffer>)を明示的に指定することで解決できます。
型引数の推論精度の向上
推論プロセスにおける「型変数のリーク」を防ぐための修正が入りました。
これにより、これまで暗黙的に通っていたジェネリック関数の呼び出しにおいて、より厳密な型指定を求められる場合があります。
エラーが発生した場合は、関数呼び出し時に明示的に型引数を渡すことで対応してください。
まとめ
TypeScript 5.9 RCは、現代の開発環境に即した実務的なアップデートが凝縮されたバージョンです。
特にimport deferのサポートは、パフォーマンスに敏感なフロントエンド開発において大きな武器となるでしょう。
また、tsc --initの刷新は、これからTypeScriptを始める初心者にとっても、プロジェクト設定を整理したいプロフェッショナルにとっても歓迎すべき変更です。
現在、TypeScriptチームはRustによるネイティブ移植版 (TypeScript 7に向けて開発中)にも注力しており、今後さらなる高速化が期待されています。
まずはこの5.9 RCをプロジェクトに導入し、進化した型システムの恩恵を体感してみてください。
