logo

TypeScript 5.8

TypeScript 5.8 の新機能と変更点

TypeScript 5.8 が 2025年2月28日に発表されました。本記事では、新機能や変更点を分かりやすく解説します。


1. return 式内の分岐に対する詳細な型チェック

TypeScript 5.8 では、return 文の直内にある条件式の各分岐を 個別にチェック するようになりました。

変更前(バグが見逃される)

declare const untypedCache: Map<any, any>;
function getUrlObject(urlString: string): URL {
  return untypedCache.has(urlString) ? untypedCache.get(urlString) : urlString;
}

このコードの意図は、キャッシュがあれば URL を返し、なければ新しい URL を作成することですが、誤って string を返しています。従来はこのバグが検出されませんでした。

変更後(バグが検出される)

declare const untypedCache: Map<any, any>;
function getUrlObject(urlString: string): URL {
  return untypedCache.has(urlString) ? untypedCache.get(urlString) : urlString;
  // エラー: Type 'string' is not assignable to type 'URL'.
}

各分岐の型が個別にチェックされるため、型エラーを適切に検出できます。


2. Node.js ESM の require() サポート

Node.js 22 から CommonJS から ESM を require() で読み込むことが可能 になりました。
TypeScript 5.8 では、--module nodenext でこの動作をサポートします。

// CommonJS ファイル
const myModule = require("./my-esm-module.js");

以前は require() で ESM を読み込むとエラーでしたが、Node.js 22 以降では可能になり、TypeScript もこれをサポートします。

🔹 注意点

  • import の場合と異なり、トップレベルの await を含む ESM ファイル は require() で読み込めません。
  • 古い Node.js では --module node16node18 を使用 する必要があります。

3. --erasableSyntaxOnly オプション

Node.js 23.6 では、型情報を削除した TypeScript を直接実行する機能 (--experimental-strip-types) が導入されました。
TypeScript 5.8 では、このモードを 事前にチェックする --erasableSyntaxOnly フラグを追加しました。

サポートされない構文

// ❌ サポートされない構文(エラー)
enum Direction { Up, Down, Left, Right }
namespace container { export const value = 42; }
import Bar = container.value;

エラー: ランタイムで意味を持つ TypeScript の構文 (enum, namespace, import = など) を使用すると、チェック時にエラーが出ます。


4. 新しい --module node18 フラグ

TypeScript 5.8 では、Node.js 18 固有の動作を固定する --module node18 を導入しました。

🔹 node18nodenext の違い

フラグ

ESM の require()

インポートアサーション

node18

❌ できない

✅ 許可される

nodenext

✅ できる

❌ 非推奨

Node.js 18 を使うプロジェクトでは --module node18 を設定すると、Node.js 18 の仕様に合わせた型チェック が行われます。


5. --libReplacement フラグ

TypeScript 5.8 では、カスタム lib ファイルの検索を無効化 する --libReplacement フラグを追加しました。

背景

TypeScript 4.5 以降、デフォルトの lib をカスタムバージョンに置き換えられるようになりました。

{
  "devDependencies": {
    "@typescript/lib-dom": "npm:@types/web@0.0.199"
  }
}

しかし、TypeScript は lib の変更を常に監視していたため、パフォーマンスの問題がありました。

🔹 改善点

{
  "compilerOptions": {
    "libReplacement": false  // カスタム lib の検索を無効化
  }
}

これにより、node_modules の監視を減らし、パフォーマンスが向上します。


6. プログラムのロードと更新の最適化

TypeScript 5.8 では、パスの正規化やオプションの再検証を最適化 し、ビルド時間や --watch モードのレスポンスを改善しました。

最適化のポイント

  • パスの正規化処理の最適化
    path.split("/") を減らし、直接インデックス操作することで負荷軽減。
  • 不要なオプションの再検証をスキップ
    tsconfig.json の内容が変更されない限り、毎回のチェックを省略。

🔹 結果
ビルド時間が短縮
エディターの型チェックの応答性が向上


まとめ

TypeScript 5.8 は、型チェックの厳格化Node.js 最新バージョンの対応パフォーマンス改善 など、開発者にとってメリットの多いアップデートです。

📌 次のステップ

  • TypeScript 5.8 の公式発表 を読む
  • npm install typescript@latest で最新バージョンを試す
  • プロジェクトの型チェックを改善し、Node.js の最新機能を活用しよう! 🚀
logo