2026年2月11日、TypeScript開発チームは最新のプレビュー版となるTypeScript 6.0 Betaを正式に発表しました。
このバージョンは、TypeScriptの歴史において極めて特殊な位置付けにあります。
なぜなら、現在のJavaScriptベースのコードベースで構築される最後のリリースの予定だからです。
開発チームは現在、実行速度の向上と共有メモリによるマルチスレッディングの活用を目指し、Go言語で記述された新しいコンパイラおよび言語サービスへの移行を進めています。
このネイティブポートは次世代の「TypeScript 7.0」の基盤となりますが、今回のTypeScript 6.0はその革新的なアップデートへの「架け橋」として、既存のプロジェクトを次世代環境へ適応させるための重要な役割を担っています。
TypeScript 6.0:次世代への架け橋となるリリース
TypeScript 6.0は、バージョン5.9と7.0の間を繋ぐ重要なステップです。
今回のリリースの主な目的は、TypeScript 7.0でのネイティブポート移行に備えたコードの整理と整合性の確保にあります。
そのため、多くの変更点は将来の破壊的変更に対する準備や、新しい言語機能への対応に充てられています。
しかし、単なる準備に留まらず、型推論の改善やNode.jsの最新機能への対応、さらにはECMAScript 2025で導入される最新APIの型定義など、実用性の高い新機能も数多く含まれています。
本記事では、開発者が知っておくべき主要な機能向上と、将来のバージョン7.0に向けて実施された大幅な非推奨事項について、技術的な詳細を交えて解説します。
型推論の改善:thisを使用しない関数のコンテキスト感度の緩和
TypeScript 6.0では、コンテキストに応じた型推論 (Contextual Typing)がより賢くなりました。
具体的には、メソッド構文で定義された関数内でthisが使用されていない場合、その関数の型推論が優先的に行われるようになります。
これまでのバージョンでは、アロー関数とメソッド構文で型推論の挙動が異なるという不可解な制限がありました。
次のコード例を見てみましょう。
declare function callIt<T>(obj: {
produce: (x: number) => T,
consume: (y: T) => void,
}): void;
// TypeScript 5.x 以前でも動作する例(アロー関数)
callIt({
consume: y => y.toFixed(),
produce: (x: number) => x * 2,
});
// TypeScript 5.x ではエラーになる例(メソッド構文)
callIt({
consume(y) {
// 以前のバージョンでは 'y' が unknown 型になりエラー
return y.toFixed();
},
produce(x: number) {
return x * 2;
},
});
以前のTypeScriptでは、メソッド構文には「暗黙的なthis」が存在すると見なされていました。
thisの型がオブジェクト全体に依存し、そのオブジェクトの型が推論中の型引数Tに依存するという循環が発生するため、型推論の優先順位が下げられていたのです。
TypeScript 6.0からは、関数内で実際にthisが参照されているかどうかをコンパイラがチェックします。
thisが使われていなければ、アロー関数と同様に高精度な型推論が適用されるようになり、上記のようなメソッド構文による記述もスムーズに動作するようになりました。
モジュール解像度の進化とNode.js対応
Node.jsのエコシステム進化に合わせ、インポートパスの指定方法にも柔軟性が加わりました。
「#/」から始まるサブパスインポートのサポート
Node.jsのpackage.jsonには、パッケージ内のモジュールに別名を付ける「Subpath Imports」という機能があります。
従来、これらは#root/のようにハッシュ記号の直後に文字列を必要としていましたが、最新のNode.jsでは#/という簡潔なプレフィックスが許可されました。
TypeScript 6.0では、--moduleResolutionの設定がnode20、nodenext、またはbundlerの場合に、この形式をサポートします。
{
"name": "my-package",
"type": "module",
"imports": {
"#": "./dist/index.js",
"#/*": "./dist/*"
}
}
これにより、開発者はimport { util } from "#/utils.js"といった形式で、プロジェクト内のルートディレクトリを指すエイリアスを利用できるようになります。
moduleResolution bundler と module commonjs の併用
これまでのTypeScriptでは、--moduleResolution bundlerはモダンなesnextなどのモジュール設定としか組み合わせられませんでした。
しかし、現実の開発現場ではCommonJS形式で出力しつつ、依存関係の解決にはモダンなバンドラーの挙動を求めるケースが多く存在します。
TypeScript 6.0では、この組み合わせが正式に許可されました。
TypeScript 7.0に向けた決定論的な型順序:–stableTypeOrdering
TypeScript 7.0で予定されているネイティブポートの最大の目玉はパラレル型チェック (並列処理)による高速化です。
しかし、並列処理を行うと、型に割り振られる内部IDの順番が実行ごとに変わってしまうという課題がありました。
これまでのTypeScriptでは、ユニオン型の並び順などが内部IDの割り当て順に依存していたため、コードの記述順を変えるだけで出力される.d.tsファイルの型定義の順番が変わってしまうことがありました。
// 入力コード
const x = 500;
export function foo(condition: boolean) {
return condition ? 100 : 500;
}
// 出力結果(--stableTypeOrdering なしの場合、xの宣言によって順序が変わる可能性がある)
export declare function foo(condition: boolean): 500 | 100;
TypeScript 6.0で導入された--stableTypeOrderingフラグを有効にすると、型の内容に基づいた決定論的なアルゴリズムでソートが行われるようになります。
これにより、並列チェックを行う7.0と同じ挙動を再現でき、コンパイラ出力の差分を最小限に抑えることが可能になります。
ただし、このフラグは型チェックの速度を最大25%低下させる可能性があるため、あくまで7.0への移行診断用として利用することが推奨されています。
新しいJavaScript標準への対応
ECMAScriptの進化に追随し、最新のAPIに対する型定義が標準ライブラリに追加されました。
ECMAScript 2025 (es2025) のサポート
targetおよびlibオプションにes2025が追加されました。
これには以下の新しいAPIの型定義が含まれています。
| 機能名 | 概要 |
|---|---|
RegExp.escape | 文字列を正規表現内で安全に使用するためのエスケープ処理 |
Promise.try | 同期・非同期を問わず関数を実行しPromiseとして扱う |
Map.prototype.getOrInsert | キーが存在しない場合に値をセットして取得する (Upsert) |
Temporal | 現代的な日付・時刻操作のための新しい標準API |
Mapの「Upsert」メソッド
特に注目すべきは、Mapオブジェクトに追加されたgetOrInsertとgetOrInsertComputedです。
const cache = new Map<string, string>();
// 以前の書き方
if (!cache.has("key")) {
cache.set("key", "default_value");
}
const val = cache.get("key");
// TypeScript 6.0 (es2025) での書き方
const newVal = cache.getOrInsert("key", "default_value");
// 重い計算を伴う場合はコールバック形式を使用
const computedVal = cache.getOrInsertComputed("key", (k) => {
// 値が存在しない場合のみ実行される
return `computed_for_${k}`;
});
Temporal API の組み込み
長年議論されてきたTemporal APIの型定義が遂に標準で提供されます。
Dateオブジェクトの欠点を解消し、タイムゾーンやカレンダーの計算を直感的に行えるようになります。
// Temporalの使用例
const now = Temporal.Now.instant();
const tomorrow = now.add({ hours: 24 });
console.log(`Now: ${now.toString()}`);
console.log(`Tomorrow: ${tomorrow.toString()}`);
既存プロジェクトへの影響:デフォルト設定の大幅な変更
TypeScript 6.0では、モダンな開発環境に最適化するために、いくつかのコンパイラオプションのデフォルト値が変更されました。
既存プロジェクトをアップデートする際には注意が必要です。
| オプション | 以前のデフォルト | 6.0以降のデフォルト |
|---|---|---|
strict | false | true |
module | commonjs | esnext |
target | es3 / es5 | es2025 (最新) |
types | 全ての@typesを読み込む | [] (空配列) |
rootDir | 自動推論 | tsconfig.jsonのディレクトリ |
「types」のデフォルト変更によるビルドパフォーマンス向上
最も影響が大きい変更の一つは、typesオプションのデフォルト値が[]になったことです。
これまではnode_modules/@types配下の全てのパッケージが自動的にグローバルスコープへ読み込まれていました。
これにより利便性はありましたが、大規模なプロジェクトでは数百もの不要な型定義をスキャンすることになり、ビルド時間の増大を招いていました。
TypeScript 6.0からは、必要な型定義を明示的に指定する必要があります。
{
"compilerOptions": {
// 必要なパッケージのみを指定
"types": ["node", "jest"]
}
}
もし以前の挙動に戻したい場合は、"types": ["*"]と記述することで全ての型定義を読み込ませることが可能ですが、パフォーマンスの観点からは推奨されません。
非推奨および削除された機能
TypeScript 7.0のネイティブポートでは、実装の複雑さを解消しパフォーマンスを最大化するため、多くの古い機能がサポート対象外となります。
6.0ではこれらが「非推奨」として警告されます。
- ES5ターゲットの非推奨:
target: es5は非推奨となりました。今後はES2015以上をターゲットにするか、トランスパイラを併用する必要があります。 - module設定の整理:
amd、umd、systemjsのサポートが終了します。これらは現代のWeb標準であるESM (ECMAScript Modules) に置き換えられます。 - baseUrlの非推奨: モジュール解決において混乱を招いていた
baseUrlは非推奨となり、代わりにpathsによる明示的なマッピングが推奨されます。 - outFileの削除: 複数のファイルを一つにまとめる
outFileオプションは削除されました。バンダラー (Vite, esbuildなど) の利用が前提となります。 - namespace定義でのmoduleキーワード: 昔の名残である
module Foo { ... }形式の構文はエラーとなります。namespace Foo { ... }を使用してください。
まとめ
TypeScript 6.0 Betaは、単なるマイナーアップデートではなく、次世代のTypeScript 7.0へと繋がる最重要の橋渡しです。
ネイティブコンパイラによる圧倒的なパフォーマンス向上を手に入れるための「最後の試練」とも言えるでしょう。
特にstrict: trueのデフォルト化や、typesの自動読み込み停止、ES5の非推奨化などは、多くのプロジェクトで修正が必要になるポイントです。
しかし、これらを受け入れ、モダンな設定へと移行することは、結果としてプロジェクトの健全性を高め、将来のビルド高速化の恩恵を受けることに繋がります。
開発チームは今後数週間にわたってフィードバックを募り、安定版のリリースを目指します。
今のうちにBeta版を導入し、"ignoreDeprecations": "6.0"をセットしながら、一歩ずつTypeScript 7.0の時代に向けた準備を進めていきましょう。
