TypeScript 5の新機能 — satisfies演算子とデコレーターの実践活用
USD/JPY分散は、為替急変局面で一方通貨の過大シェアを防ぎ、月次の再バランスと上限規則で感情的な一括投資を抑える実践設計です。
核心まとめ TypeScript 5.0〜5.4の主要新機能:①
satisfies演算子 — 推論を維持しながら型を検証 ② 標準デコレーター — TC39 Stage 3標準準拠、メタデータ対応 ③constタイプパラメータ — リテラル型推論の強化 ④ 複数tsconfig拡張 ⑤ enum・namespaceの改善。実務で最も影響力が大きい機能はsatisfiesと新デコレーター。
TypeScript 5の概要
TypeScript 5は2023年3月から始まったメジャーバージョンで、5.0〜5.4まで複数のマイナーアップデートが積み重ねられています。このバージョンで最も重要な変化は、標準デコレーターとsatisfies演算子の導入です。
バージョン別の主要リリーススケジュール:
| バージョン | リリース | 主な機能 |
|---|---|---|
| TypeScript 5.0 | 2023-03 | satisfies、constタイプパラメータ、複数tsconfig拡張 |
| TypeScript 5.1 | 2023-06 | getter/setter独立型、JSX改善 |
| TypeScript 5.2 | 2023-08 | using/await usingキーワード、デコレーターメタデータ |
| TypeScript 5.3 | 2023-11 | Import Attributes、型の絞り込み改善 |
| TypeScript 5.4 | 2024-03 | NoInferユーティリティ、クロージャ内での型絞り込み保持 |
1. satisfies演算子 — 実践完全マスター
satisfies演算子はTypeScript 5.0で導入された最も革新的な機能の一つです。従来の型アサーションの限界を超え、型推論を維持しながら型制約を検証します。
従来の問題点
// ❌ 従来方式の問題点
type Color = "red" | "green" | "blue";
type ColorMap = Record<string, string | number[]>;
// asアサーション:型検証あり、推論なし
const palette = { red: [255, 0, 0], green: "#00ff00", blue: [0, 0, 255]
} as ColorMap;
// この時点でpalette.redはstring | number[]として推論される
// .map()を使うには型アサーションが必要
palette.red.map(x => x); // エラー!string | number[]にmapはないsatisfiesの活用
// ✅ satisfies演算子
type Color = "red" | "green" | "blue";
type ColorMap = Record<Color, string | number[]>;
const palette = { red: [255, 0, 0], green: "#00ff00", blue: [0, 0, 255]
} satisfies ColorMap;
// 型検証あり、リテラル推論あり
palette.red.map(x => x); // ✅ number[]として保持
palette.green.toUpperCase(); // ✅ stringとして保持
const wrong = { purple: "purple" } satisfies ColorMap; // ❌ エラー:"purple"はColorではない実践活用パターン
パターン1:APIレスポンスオブジェクトの検証
interface ApiConfig { baseUrl: string; timeout: number; retries: number;
}
// satisfiesで型検証 + 正確な値の推論を維持
const config = { baseUrl: "https://api.example.com", timeout: 5000, retries: 3,
} satisfies ApiConfig;
// config.timeoutはnumberではなく5000(リテラル型)
type TimeoutType = typeof config.timeout; // 5000パターン2:ルート定義
type Route = { path: string; component: React.ComponentType; auth?: boolean;
};
const routes = [ { path: "/", component: Home }, { path: "/dashboard", component: Dashboard, auth: true },
] satisfies Route[];
// routes[0].pathは"/"(リテラル)として保持され、Routeの検証も通過パターン3:多言語翻訳オブジェクト
type TranslationKey = "hello" | "goodbye" | "welcome";
type Translations = Record<TranslationKey, string>;
const ko = { hello: "韓国用語", goodbye: "韓国用語 韓国用語", welcome: "韓国用語",
} satisfies Translations;
const en = { hello: "Hello", goodbye: "Goodbye", // welcome 不足 → コンパイルエラー発生! ✅
} satisfies Translations;2. 標準デコレーター — TC39 Stage 3完全実装
TypeScript 5.0は長年使われてきた実験的デコレーター(experimentalDecorators)とは別に、TC39 Stage 3標準デコレーターをサポートします。
主な違い
| 区分 | 実験的デコレーター | 標準デコレーター(5.0+) |
|---|---|---|
| 有効化方法 | experimentalDecorators: true | デフォルトで有効(tsconfig不要) |
| 標準準拠 | 独自実装 | TC39 Stage 3 |
| 実行順序 | 逆順 | 正順 |
| メタデータ | emitDecoratorMetadata | Symbol.metadataを使用 |
| 関数サポート | 限定的 | クラス専用 |
クラスデコレーター
// ✅ TypeScript 5標準デコレーター
function sealed(target: typeof SealedClass) { Object.seal(target); Object.seal(target.prototype);
}
@sealed
class SealedClass { greet() { return "Hello!"; }
}メソッドデコレーター
function log(target: any, context: ClassMethodDecoratorContext) { const methodName = String(context.name); return function (this: any, ...args: any[]) { console.log(`[${methodName}] 呼び出し、引数:`, args); const result = target.call(this, ...args); console.log(`[${methodName}] 戻り値:`, result); return result; };
}
class Calculator { @log add(a: number, b: number): number { return a + b; }
}
const calc = new Calculator();
calc.add(1, 2);
// [add] 呼び出し、引数: [1, 2]
// [add] 戻り値: 3アクセサデコレーター
function readonly(target: any, context: ClassAccessorDecoratorContext) { return { set() { throw new Error(`${String(context.name)}は読み取り専用です。`); } };
}
class Config { @readonly accessor version = "1.0.0";
}
const cfg = new Config();
console.log(cfg.version); // "1.0.0"
cfg.version = "2.0.0"; // ❌ エラー発生デコレーターメタデータ(TypeScript 5.2)
// メタデータAPIの活用
function validate(target: any, context: ClassFieldDecoratorContext) { context.metadata[context.name] = { required: true };
}
class UserForm { @validate name!: string; @validate email!: string;
}
// メタデータの読み取り
const metadata = UserForm[Symbol.metadata];
console.log(metadata); // { name: { required: true }, email: { required: true } }3. constタイプパラメータ
TypeScript 5.0で追加されたconst修飾子は、ジェネリック関数の型推論を強化します。
// ❌ 従来方式
function identity<T>(value: T): T { return value;
}
const result = identity(["a", "b", "c"]);
// result: string[](リテラルが失われる)
// ✅ constタイプパラメータ
function identityConst<const T>(value: T): T { return value;
}
const result2 = identityConst(["a", "b", "c"]);
// result2: readonly ["a", "b", "c"](リテラルを維持!)実践活用:パスビルダー
function createRoute<const Path extends string>(path: Path) { return { path, url: () => `https://app.example.com${path}` };
}
const homeRoute = createRoute("/");
// homeRoute.path: "/"(リテラル維持)
const dashRoute = createRoute("/dashboard");
// dashRoute.path: "/dashboard"(リテラル維持)4. 複数tsconfig拡張
TypeScript 5.0から、tsconfig.jsonのextendsに配列を使用できるようになりました。
// tsconfig.json
{ "extends": [ "@tsconfig/strictest/tsconfig.json", "@tsconfig/node18/tsconfig.json", "./custom.tsconfig.json" ], "compilerOptions": { "outDir": "dist" }
}以前はチェーン形式で複数のファイルを継承する必要がありましたが、配列で一度に多重継承できるようになりました。
5. using / await usingキーワード(TypeScript 5.2)
リソース管理のための新キーワードで、Javaのtry-with-resourcesと類似しています。
// Symbol.disposeを持つオブジェクト
class DbConnection { constructor(public readonly id: string) {} [Symbol.dispose]() { console.log(`接続 ${this.id} を終了`); }
}
function getConnection() { return new DbConnection("conn-001");
}
// using:ブロックを抜ける際に自動でdispose()が呼ばれる
{ using conn = getConnection(); console.log(`接続 ${conn.id} を使用中`); // ブロック終了時に自動で「接続 conn-001 を終了」が出力される
}
// await using:非同期リソースの解放
async function processFile() { await using file = await openFile("data.txt"); // 処理完了後に自動で await file[Symbol.asyncDispose]() が呼ばれる
}6. NoInferユーティリティ型(TypeScript 5.4)
特定箇所の型推論を意図的にブロックします。
// 問題:Tがデフォルト値からも推論されて型が広がってしまう
function createState<T>(initial: T, fallback: T): T { return initial ?? fallback;
}
// fallbackが初期値に影響を与えてはいけない場合
const state = createState("active", "inactive");
// T: "active" | "inactive"(望まない動作の可能性)
// ✅ NoInferを使用
function createStateBetter<T>(initial: T, fallback: NoInfer<T>): T { return initial ?? fallback;
}
const state2 = createStateBetter("active", "inactive");
// T: "active"、fallbackは"active"型として検証される
// createStateBetter("active", "unknown") // エラー!マイグレーションガイド
TypeScript 4.x → 5.x移行時の注意点
| 変更点 | 影響 | 対応 |
|---|---|---|
| 実験的デコレーターの維持 | 既存コードの互換 | experimentalDecorators: trueの維持が可能 |
| enum定数のインライン最適化 | ビルド成果物が変わる可能性 | バンドルサイズの確認 |
tsconfig extends配列 | 既存の文字列方式と互換 | 変更不要 |
--verbatimModuleSyntax | 一部importでエラー | 型専用importを明示する必要 |
推奨tsconfig設定(2026年基準)
{ "compilerOptions": { "target": "ES2022", "lib": ["ES2022", "DOM", "DOM.Iterable"], "module": "Node16", "moduleResolution": "Node16", "strict": true, "exactOptionalPropertyTypes": true, "noUncheckedIndexedAccess": true, "noImplicitOverride": true, "verbatimModuleSyntax": true }
}💡 TypeScriptコード作成ツールが必要ですか? コードの可読性分析には読書時間計算機を活用してみてください。
📣 対価性のお知らせ:この投稿には一部のツールリンクが含まれており、所定の手数料を受け取る場合があります。
よくある質問(FAQ)
Q1. TypeScript 5はTypeScript 4.xと互換性がありますか? A. ほとんどの場合、下位互換性があります。ただし、実験的デコレーターを使用中の場合は、experimentalDecorators: true設定を維持する必要があります。
Q2. satisfiesとasアサーションの違いは? A. asは型検証なしで強制変換します。satisfiesは型制約を検証しつつ、元のリテラル推論を維持します。
Q3. 標準デコレーターでNestJSを使えますか? A. NestJSは現在experimentalDecorators: trueベースです。標準デコレーターへの移行はNestJSチームが長期ロードマップとして計画中です。
Q4. constタイプパラメータはどんな場面で使うとよいですか? A. 関数がリテラル値をそのまま返す場合や、タプル・配列の正確な型が必要な場合に有用です。ルーティング、設定オブジェクト、翻訳キーなどに適しています。
Q5. usingキーワードをサポートするNode.jsバージョンは? A. usingはTypeScript 5.2+とNode.js 18+の組み合わせで使用可能です。TypeScriptがSymbol.disposeを活用するため、ポリフィルが必要になる場合があります。
Q6. NoInferは実務でどのような場合に使いますか? A. API関数の型パラメータがデフォルト値によって意図せず広がるのを防ぐ際に有用です。特にジェネリックなファクトリ関数を書く場合に活用されます。
Q7. TypeScript 5.4のクロージャ内での型絞り込みとは? A. 従来は関数内クロージャで型の絞り込みが維持されないケースがありました。5.4からはクロージャ内でも、最後の代入が型の絞り込みに利用されます。
Q8. verbatimModuleSyntaxオプションとは? A. 型専用のimport/exportをimport typeとexport typeで明示的に区別することを強制します。バンドラーとの互換性を高め、不要なランタイムコードを取り除きます。
🔧 Related Free Tools
関連
USD/JPY分散は、為替急変局面で一方通貨の過大シェアを防ぎ、月次の再バランスと上限規則で感情的な一括投資を抑える実践設計です。...
ITChatGPTで副収入を得る6つの方法 — 2026年版の実践済みマネタイズガイドUSD/JPY分散は、為替急変局面で一方通貨の過大シェアを防ぎ、月次の再バランスと上限規則で感情的な一括投資を抑える実践設計です。...
IT2026 ChatGPT vs Claude vs Gemini — AIチャットボット性能・価格・活用法を徹底比較USD/JPY分散は、為替急変局面で一方通貨の過大シェアを防ぎ、月次の再バランスと上限規則で感情的な一括投資を抑える実践設計です。...
ITウェブサイト速度最適化 2026 — Core Web Vitals 90+ 達成法USD/JPY分散は、為替急変局面で一方通貨の過大シェアを防ぎ、月次の再バランスと上限規則で感情的な一括投資を抑える実践設計です。...