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に「キーが存在しなければデフォルト値を挿入して返す」パターンを簡潔に書ける
getOrInsertとgetOrInsertComputedが追加されました。
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
理解度チェック
TypeScript 6.0で「strict」オプションのデフォルト値はどう変わりましたか?
キーボード: 1〜4 で選択、Enter で回答