TypeScript 6.0とは何か

2026年3月23日、MicrosoftはTypeScript 6.0をリリースしました。 このバージョンは、現在のJavaScript製コンパイラにとって最後のメジャーリリースです。 次のTypeScript 7.0では、コンパイラがGoで完全に書き直され、ネイティブコードの速度とマルチスレッド並列処理の恩恵を受けることになります。

つまり、TypeScript 6.0は「5.xの世界」から「7.0の世界」への橋渡しリリースとして設計されています。 新機能の追加に加え、レガシーオプションの廃止と新しいデフォルト値の導入を通じて、7.0へのスムーズな移行を準備するのがこのバージョンの最大の目的です。

デフォルト値の大変更

TypeScript 6.0の最も影響の大きい変更は、コンパイラオプションのデフォルト値の刷新です。 既存プロジェクトでは、tsconfig.jsonに明示的に設定していないオプションの挙動が大きく変わります。

オプション 旧デフォルト 新デフォルト(6.0) 影響
strict false true 厳密な型チェックがデフォルトで有効に
target es5 es2025 最新ECMAScript機能がそのまま出力
module commonjs esnext ESMがデフォルトの出力形式に
rootDir (ソースから推論) .(tsconfig位置) 出力ディレクトリ構造が変化する可能性
types ["*"](自動検出) [](空) @typesパッケージの明示指定が必須に
noUncheckedSideEffectImports false true 副作用importの解決を検証

@typesの明示指定が必須に

最も多くのプロジェクトで即座にエラーを引き起こすのがtypesのデフォルト変更です。 これまではnode_modules/@types配下のすべての型定義が自動で読み込まれていましたが、 6.0では明示的に指定したものだけが読み込まれます。

// tsconfig.json — 6.0で必要になる設定
{
  "compilerOptions": {
    "types": ["node", "jest"]  // 必要な@typesを明示
  }
}

設定しないとCannot find name 'process'Cannot find name 'describe' といったエラーが大量に発生します。

rootDirの変更による出力構造のずれ

rootDirの推論ロジックが変わったことで、出力ファイルのディレクトリ構造が意図せず変わる場合があります。

// 5.9まで: rootDirがソースファイルから推論
dist/index.js
dist/utils.js

// 6.0: rootDirがtsconfig.jsonの位置(.)になる
dist/src/index.js    // srcディレクトリが挟まる
dist/src/utils.js

対処法はシンプルで、rootDirを明示的に設定します:

{
  "compilerOptions": {
    "rootDir": "./src"
  }
}

新機能

Temporal API型定義

JavaScriptのDateオブジェクトの後継として長らく策定が進められてきたTemporal APIが Stage 4に到達し、TypeScript 6.0で型定義が標準搭載されました。 esnext.temporal libを通じて利用できます。

// Temporalで24時間前のInstantを取得
const yesterday = Temporal.Now.instant().subtract({ hours: 24 });

// タイムゾーンを意識した日時操作
const meeting = Temporal.ZonedDateTime.from({
  timeZone: "Asia/Tokyo",
  year: 2026,
  month: 4,
  day: 1,
  hour: 10,
  minute: 0,
});

// 期間の計算
const duration = Temporal.Duration.from({ hours: 1, minutes: 30 });

Map/WeakMapのupsertメソッド

MapやWeakMapに「キーが存在しなければデフォルト値を挿入して返す」パターンを簡潔に書ける getOrInsertgetOrInsertComputedが追加されました。

const cache = new Map<string, number[]>();

// 従来のパターン
if (!cache.has("users")) {
  cache.set("users", []);
}
cache.get("users")!.push(42);

// 6.0: getOrInsertで簡潔に
cache.getOrInsert("users", []).push(42);

// 計算が必要な場合
cache.getOrInsertComputed("stats", (key) => computeExpensiveStats(key));

RegExp.escape

ユーザー入力を正規表現に安全に埋め込むためのRegExp.escapeが標準化されました。

function searchWholeWord(word: string, text: string): RegExpMatchArray | null {
  const escaped = RegExp.escape(word);  // 特殊文字を自動エスケープ
  const regex = new RegExp(`\\b${escaped}\\b`, "g");
  return text.match(regex);
}

// RegExp.escape("foo.bar") → "foo\.bar"
// RegExp.escape("(1+1)") → "\(1\+1\)"

その他のES2025サポート

機能 概要 使用例
Promise.try() 同期/非同期関数をPromiseとして統一実行 Promise.try(() => JSON.parse(str))
Iteratorヘルパー Iteratorにmap/filter/takeなどのメソッド追加 iter.map(x => x * 2).take(5).toArray()
Set集合演算 union/intersection/differenceメソッド setA.intersection(setB)
Float16Array 16ビット浮動小数点配列 ML推論データの効率的な格納
Intl.DurationFormat 期間の国際化フォーマット new Intl.DurationFormat("ja")

this不要関数の型推論改善

オブジェクトリテラル内のメソッド構文でthisを使用しない関数は、 型引数の推論で優先度が下げられるようになりました。 これにより、プロパティの定義順序に依存していた型推論の問題が解消されます。

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

// 5.9ではプロパティ順序によってTの推論が変わることがあった
// 6.0ではthisを使わないメソッドは推論で適切に処理される
callIt({
  consume(y) { y.toFixed(); },  // yはnumberと正しく推論
  produce(x) { return x * 2; },
});

廃止されたオプション

TypeScript 6.0では多数のレガシーオプションが非推奨になりました。 これらは6.0ではエラーを出しますが、"ignoreDeprecations": "6.0"で一時的に抑制できます。 ただし、7.0では完全に削除されるため、早めの対応が必要です。

廃止オプション 代替手段 理由
target: es5 es2015以上 + 外部トランスパイラ IE退役によりES5出力が不要に
moduleResolution: node(node10) nodenextまたはbundler exportsフィールド未対応の古いアルゴリズム
module: amd/umd/system/none ESM + バンドラー レガシーモジュールシステムの完全廃止
baseUrl(モジュール解決用) pathsに直接パス記述 暗黙のモジュール解決を排除
outFile esbuild / Webpack / Rollup バンドリングはバンドラーの責務
esModuleInterop: false 常にtrue(設定不可) CJS interopの安全性を保証
downlevelIteration (削除) ES5ターゲット廃止により不要
module Foo {}構文 namespace Foo {} ESモジュールとの名前衝突を回避
assert { }(Import Assertions) with { }(Import Attributes) ECMAScript仕様の変更に追従

Import Assertions → Import Attributes

// 廃止: assert構文
import data from "./data.json" assert { type: "json" };

// 6.0: with構文に移行
import data from "./data.json" with { type: "json" };

module → namespace

// 廃止: module キーワードによる名前空間
module MyApp {
  export function init() {}
}

// 6.0: namespace キーワードを使用
namespace MyApp {
  export function init() {}
}

5.xからの移行手順

移行は優先度順に進めるのが効率的です。以下のチェックリストに従って対応してください。

Priority 1: ビルドを通す(必須)

// tsconfig.json — まず最低限これを追加
{
  "compilerOptions": {
    "types": ["node"],        // @typesの明示(プロジェクトに応じて追加)
    "rootDir": "./src"        // ソースディレクトリを明示
  }
}

Priority 2: 廃止オプションの置き換え

// 移行前
{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "baseUrl": ".",
    "paths": { "@app/*": ["src/app/*"] },
    "esModuleInterop": true,
    "downlevelIteration": true
  }
}

// 移行後
{
  "compilerOptions": {
    "target": "es2020",
    "module": "esnext",
    "moduleResolution": "bundler",
    "paths": { "@app/*": ["./src/app/*"] },
    "types": ["node"]
  }
}

自動マイグレーションツール

ts5to6ツールを使えば、最も破壊的な変更を自動で修正できます:

# baseUrlの移行(pathsにインライン化)
npx @andrewbranch/ts5to6 --fixBaseUrl .

# rootDirの修正
npx @andrewbranch/ts5to6 --fixRootDir .

パフォーマンス改善

コンパイラ本体にも性能改善が入っています:

  • インクリメンタルビルド: 再ビルド時間が40〜60%短縮。型解決結果のキャッシュがより積極的に
  • メモリ消費: 大規模コードベースでピークメモリ使用量が約25%削減
  • watchモード: キャッシュ効率の向上により、ファイル変更時の再チェックが高速化

TypeScript 7.0への道

TypeScript 6.0の最大の意義は、7.0への準備にあります。 7.0ではコンパイラがGoで再実装され、以下の恩恵が期待されます:

  • ネイティブコードの速度: JavaScript実行エンジンの制約から解放される
  • 共有メモリマルチスレッド: 型チェックの並列実行が可能に
  • 決定論的な型順序: 宣言出力の差異がなくなる

6.0で導入された--stableTypeOrderingフラグは、 6.0と7.0の出力差異を事前に検出するための診断ツールです。 パフォーマンスが最大25%低下するため常用は非推奨ですが、移行テスト時に活用できます。

# 7.0ネイティブプレビューのインストール
npm install -D @typescript/native-preview

# 既存プロジェクトで試す
npx tsgo --project tsconfig.json

TypeScript 6.0 Beta

新デフォルト値と廃止オプションの公開

TypeScript 6.0 RC

リリース候補、APIの安定化

TypeScript 6.0 GA

JS製コンパイラの最終メジャーリリース

TypeScript 7.0

Go製コンパイラによる次世代TypeScript

理解度チェック

問題 0 / 50%
Q1

TypeScript 6.0で「strict」オプションのデフォルト値はどう変わりましたか?

キーボード: 1〜4 で選択、Enter で回答