TypeScript 2025 - ESM完全移行とECMAScript 2025対応

2026.01.12

公式ドキュメント

TypeScript 2025年の進化

2025年はTypeScriptがESモジュール(ESM)を完全に採用した年です。新規プロジェクトはデフォルトでESMになり、Node.js、Deno、ブラウザとの相互運用性が向上しました。

ECMAScript 2025 標準化

2025年6月25日、第129回ECMA総会でECMAScript 2025(ES2025)が正式承認されました。ECMA-262標準の第16版となります。

ES2025の主要機能

// Iterator Helpers(ES2025)
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.values()
 .filter(n => n % 2 === 0)
 .map(n => n * 2)
 .toArray();
// [4, 8]

// TypeScript 5.6でIteratorObjectインターフェースを導入
// ES2025のIteratorクラスとの名前衝突を解決

TypeScript 5.x シリーズの進化

TypeScript 5.7(2024年11月)

// 改善された型推論
const config = {
 port: 3000,
 host: "localhost"
} as const satisfies Config;

// より厳密な型チェック
function process(value: string | null) {
 if (value !== null) {
 // valueは自動的にstring型に絞り込み
 console.log(value.toUpperCase());
 }
}

TypeScript 5.8(2025年3月)

// 改善されたconditional型
type UnwrapPromise<T> = T extends Promise<infer U> ? U : T;

// より高速なエディタサポート
// プロジェクト参照の改善

TypeScript 5.9(最新)

// Deferred Module Evaluation(ES提案)
import defer * as utils from "./utils.js";

// utilsは遅延評価され、実際に使用されるまで実行されない
function processData() {
 // この時点でutilsモジュールが初めて評価される
 return utils.transform(data);
}

TypeScript 5.0 からの主な変更

デコレータ標準化

// ECMAScript標準のデコレータ
function logged(target: any, context: ClassMethodDecoratorContext) {
 return function (...args: any[]) {
 console.log(`Calling ${String(context.name)}`);
 return target.apply(this, args);
 };
}

class Calculator {
 @logged
 add(a: number, b: number): number {
 return a + b;
 }
}

constタイプパラメータ

// constによる推論の制御
function createPair<const T extends readonly [unknown, unknown]>(
 pair: T
): T {
 return pair;
}

const result = createPair(["hello", 42] as const);
// 型: readonly ["hello", 42]

verbatimModuleSyntax

// モジュール構文の厳密化
import type { User } from "./types"; // 型のみのインポート
import { processUser } from "./utils"; // 値のインポート

実践メモ: 新規プロジェクトではtsconfig.jsonで"module": "nodenext"を設定し、ESMファーストで始めましょう。

ESM完全移行

2025年、TypeScriptプロジェクトはrequire/module.exportsからimport/exportへ完全移行。

// tsconfig.json(2025年推奨設定)
{
 "compilerOptions": {
 "target": "ES2024",
 "module": "NodeNext",
 "moduleResolution": "NodeNext",
 "esModuleInterop": true,
 "verbatimModuleSyntax": true,
 "strict": true,
 "skipLibCheck": true
 }
}
// ESMスタイル
import { readFile } from "node:fs/promises";
import path from "node:path";

export async function loadConfig(configPath: string) {
 const fullPath = path.resolve(configPath);
 const content = await readFile(fullPath, "utf-8");
 return JSON.parse(content);
}

ポイント: TypeScript 7はGoで再実装され、コンパイル速度が10倍に向上する見込みです。大規模プロジェクトのビルド時間が劇的に短縮されます。

TypeScript 7: Goによる再実装

衝撃的な発表として、TypeScriptランタイムがGo言語で完全に書き直されることが予定されています。

期待される改善

  • ビルド速度: 最大10倍高速化
  • メモリ使用量: 大幅削減
  • IDE応答性: 劇的な向上

TypeScript 5.0での基盤作り

  • 名前空間からモジュールへの移行
  • 一部プロジェクトで最大81%のビルド時間短縮
  • パッケージサイズの削減

実践的な設定例

Next.js + TypeScript

// tsconfig.json
{
 "compilerOptions": {
 "lib": ["dom", "dom.iterable", "esnext"],
 "allowJs": true,
 "skipLibCheck": true,
 "strict": true,
 "noEmit": true,
 "esModuleInterop": true,
 "module": "esnext",
 "moduleResolution": "bundler",
 "resolveJsonModule": true,
 "isolatedModules": true,
 "jsx": "preserve",
 "incremental": true,
 "plugins": [
 { "name": "next" }
 ]
 }
}

Node.js バックエンド

// tsconfig.json
{
 "compilerOptions": {
 "target": "ES2022",
 "module": "NodeNext",
 "moduleResolution": "NodeNext",
 "outDir": "./dist",
 "rootDir": "./src",
 "strict": true,
 "declaration": true,
 "sourceMap": true
 }
}

注意: CJS→ESM移行ではrequire()からimportへの変更に加え、拡張子の明示的指定が必要になります。段階的な移行を推奨します。

移行ガイド

5.0への移行

# アップグレード
npm install typescript@latest

# 自動移行ツール
npx @typescript/migrate

チェックリスト

  • moduleResolutionを”bundler”または”NodeNext”に更新
  • デコレータを新しい標準構文に移行
  • verbatimModuleSyntaxの有効化を検討
  • 型のみのインポートにtype修飾子を追加

参考: TypeScript Documentation

まとめ

2025年のTypeScriptは、ECMAScript標準との密接な連携、ESMへの完全移行、そして将来のGo実装による大幅な高速化など、言語とツールチェーンの両面で進化を続けています。エコシステムの成熟により、フロントエンドからバックエンドまで、TypeScriptはモダンなJavaScript開発の標準となりました。

参考リソース

← 一覧に戻る
PR
PR
PR
PR