2026年3月6日、MicrosoftのTypeScript開発チームはTypeScript 6.0のリリース候補 (RC) を発表しました。

今回のリリースは、単なる機能追加にとどまらない非常に重要な節目となります。

なぜなら、TypeScript 6.0は現在のJavaScriptベースのコードベースで構築される最後のメジャーリリースとなる予定だからです。

開発チームが進めている次世代のTypeScript 7.0では、Go言語で書き直された新しいコンパイラとランゲージサービスが導入される予定であり、ネイティブコードによる高速化と共有メモリを用いたマルチスレッド処理の恩恵を受けることになります。

TypeScript 6.0は、この「7.0」という新時代へ移行するための架け橋 (ブリッジ) としての役割を担っており、多くの変更点が次期バージョンへの準備を目的としています。

本記事では、TypeScript 6.0で導入された新機能、そして7.0に向けて実施された大幅な仕様変更について解説します。

TypeScript 6.0の位置付け:ネイティブ版7.0への布石

TypeScript 6.0は、開発者が既存のプロジェクトをスムーズに次世代版へ移行させるための準備期間を提供します。

現在、TypeScriptのコンパイラはJavaScript (Node.js) 上で動作していますが、肥大化したプロジェクトではビルド時間や型チェックの遅延が課題となっていました。

これに対し、開発チームはコンパイラのネイティブポート (Go言語への移植) を進めています。

この新しいアーキテクチャが採用されるTypeScript 7.0以降では、パフォーマンスが飛躍的に向上することが期待されています。

TypeScript 6.0は、このアーキテクチャ変更に伴う挙動の違いを吸収し、不整合を事前に解消するための調整が主眼に置かれています。

RC版の導入方法

最新のRC版を試すには、npmを使用して以下のコマンドを実行します。

Shell
npm install -D typescript@rc

型推論の改善:thisを使用しない関数のコンテキスト感度緩和

TypeScript 6.0では、関数の型推論がより直感的になりました。

特に、ジェネリック関数に渡されるオブジェクト内のメソッドにおいて、thisを明示的に使用していない場合の推論精度が向上しています。

従来、TypeScriptは「コンテキストに依存する関数 (Contextually Sensitive Functions) 」を処理する際、型引数の候補を見つけるために、明示的な型指定のないパラメータを持つ関数を一旦スキップするアルゴリズムを持っていました。

しかし、メソッド構文で書かれた関数には暗黙的にthisが存在すると見なされ、結果として推論が失敗することがありました。

TypeScript 6.0では、関数内で実際にthisが使用されているかどうかを判断基準に加えるようになりました。

TypeScript
declare function callIt<T>(obj: {
    produce: (x: number) => T,
    consume: (y: T) => void,
}): void;

// TypeScript 6.0では、プロパティの順序に関わらず正しく推論されます
callIt({
    consume(y) { 
        // 以前のエラー:'y' is of type 'unknown'
        // 6.0以降:'y' は number と推論される
        return y.toFixed(); 
    },
    produce(x: number) { 
        return x * 2; 
    },
});

この改善により、メソッド構文を多用するライブラリやコードベースにおいて、不要な型注釈を減らすことが可能になります。

モジュール解決とNode.jsエコシステムへの対応

Node.jsの最新動向に合わせた、モジュール解決の柔軟性向上も今回のトピックです。

サブパスインポートの「#/」サポート

Node.jsのpackage.jsonにおける「subpath imports」機能において、新たに#/で始まるプレフィックスがサポートされました。

これにより、プロジェクト内部のパスエイリアスをより簡潔に記述できるようになります。

JSON
{
    "name": "my-package",
    "type": "module",
    "imports": {
        "#": "./dist/index.js",
        "#/*": "./dist/*"
    }
}

TypeScript 6.0では、--moduleResolutionの設定がnode20nodenext、またはbundlerの場合に、この新しい構文を正しく認識します。

bundler設定とCommonJSの併用

従来、--moduleResolution bundlerは、--module esnextなどと組み合わせて使用することが推奨されていました。

しかし、従来のnode10 (node) 設定が非推奨となったことを受け、TypeScript 6.0では–module commonjsと–moduleResolution bundlerの組み合わせが正式に許容されるようになりました。

これは、既存のCommonJSプロジェクトがモダンなモジュール解決アルゴリズムへ移行するための有効な手段となります。

TypeScript 7.0への移行支援:–stableTypeOrderingフラグ

TypeScript 7.0のネイティブポートでは、並列型チェックが導入されます。

並列処理を行う際、内部的な「型ID」の割り当て順序が非決定的になるという課題がありました。

これを解決するため、TypeScript 7.0ではオブジェクトの内容に基づいた決定論的なアルゴリズムでソートを行うようになります。

これに伴い、ユニオン型の表示順序などが以前のバージョンと変わる可能性があります。

TypeScript 6.0では、この新しい順序付けを事前にシミュレーションするための--stableTypeOrderingフラグが導入されました。

TypeScript
// input: sample.ts
export function foo(condition: boolean) {
    return condition ? 100 : 500;
}

// 従来の出力例
// export declare function foo(condition: boolean): 100 | 500;

// --stableTypeOrdering 有効時の出力例(一貫した順序)
// export declare function foo(condition: boolean): 500 | 100;

このフラグを有効にすることで、6.0から7.0へ移行した際の宣言ファイル (d.ts) の差分を最小限に抑え、意図しない型エラーの発生を事前に確認できます。

ただし、型チェックの速度が最大25%程度低下するため、長期的な使用ではなく移行の診断目的で使用することが推奨されています。

ECMAScriptの最新仕様への追従

TypeScript 6.0は、最新のJavaScript機能に対する型定義をいち早く取り込んでいます。

Temporal APIのサポート

長らく待望されていた、新しい日付・時刻操作APIである「Temporal」の型定義が標準で含まれるようになりました。

TypeScript
// Temporal APIの使用例
let yesterday = Temporal.Now.instant().subtract({
    hours: 24,
});

console.log(`Yesterday: ${yesterday}`);

--target esnext または lib: ["esnext"] を設定することで、これらを利用可能になります。

Map/WeakMapの「upsert」メソッド

Mapに対してキーが存在しない場合に値を設定し、存在する場合はその値を返す、といった操作を効率化する「upsert (getOrInsert) 」プロポーザルに対応しました。

TypeScript
function processOptions(compilerOptions: Map<string, unknown>) {
    // getOrInsertを使用すると、存在チェックとセットを一括で行える
    let strictValue = compilerOptions.getOrInsert("strict", true);
}

計算コストが高いデフォルト値が必要な場合は、コールバックを受け取るgetOrInsertComputedも利用できます。

RegExp.escape

正規表現の特殊文字をエスケープするための標準メソッド、RegExp.escapeの型が追加されました。

TypeScript
const word = "hello*world?";
const escaped = RegExp.escape(word);
// escaped: "hello\\*world\\?"

破壊的変更とデフォルト値の刷新

TypeScript 6.0では、モダンな開発環境に最適化するため、多くのデフォルト設定が変更されました。

既存のプロジェクトをアップデートする際は、特に以下の点に注意が必要です。

構成設定のモダン化

新しいプロジェクトにおいて、より安全で一貫性のあるコードを記述できるよう、以下のデフォルト値が変更されています。

オプション以前のデフォルト6.0以降のデフォルト理由
strictfalsetrue型の安全性を最優先するため
modulecommonjs (環境依存)esnextESMが標準の時代になったため
targetes3 / es5es2025モダンなランタイムへの対応
typesすべて含む[] (空配列)パフォーマンス向上のため

特にtypesのデフォルトが空配列になった影響は大きく、Node.jsなどのグローバルな型定義が必要な場合は、明示的に指定する必要があります。

JSON
{
    "compilerOptions": {
        "types": ["node"]
    }
}

これにより、ビルド時に不要な@typesパッケージをスキャンしなくなるため、ビルド速度が20%~50%向上する可能性があります。

rootDirの挙動変更

これまで、rootDirは入力ファイルから自動的に推論されていました。

しかし、この推論プロセスはビルドの予測可能性を下げ、プロジェクト構造の把握に時間を要する原因となっていました。

TypeScript 6.0からは、tsconfig.jsonが存在する場合、rootDirは常にtsconfig.jsonがあるディレクトリを指すようになります。

ソースコードをsrcフォルダに置いている場合は、明示的に設定が必要になるケースがあります。

非推奨・削除された機能

古いJavaScript環境や、現在ではより良い代替手段が存在する機能が非推奨となりました。

  • target: es5 の非推奨: IEの引退に伴い、TypeScriptの最低ターゲットはES2015以降となります。ES5への変換が必要な場合は、外部のトランスパイラ (esbuild, SWCなど) を併用することが推奨されます。
  • baseUrl の非推奨: モジュール解決におけるbaseUrlの使用は、混乱を招きやすいため非推奨となりました。paths設定のみで十分に対応可能です。
  • outFile の非推奨: 複数のファイルを1つにまとめる機能は、Viteやesbuildなどのモダンなバンドラーに役割を譲ることになりました。
  • moduleキーワードによる名前空間の定義: module Foo { ... } 形式は廃止され、namespace Foo { ... } への移行が必須となります。

まとめ

TypeScript 6.0 RCは、単なる機能強化版ではなく、TypeScriptの第2章である「7.0 (Native Port) 」への架け橋となる重要なリリースです。

パフォーマンスを最大化するために古い仕様を切り捨て、モダンなデフォルト設定へと舵を切りました。

開発者の皆様には、まず既存プロジェクトでRC版を試し、特にtypes設定や非推奨警告のチェックを行うことを強くお勧めします。

ここで対応を行っておくことで、近いうちに登場する超高速なTypeScript 7.0の恩恵を、スムーズに受けられるようになるはずです。

TypeScriptの進化は、ついに「コンパイラ自体のネイティブ化」という大きな転換点を迎えようとしています。

この新しい波に乗り遅れないよう、まずは6.0での準備を整えていきましょう。