11月23日、TypeScriptチームは最新バージョンであるTypeScript 5.7を正式リリースした。このバージョンでは、型チェックの強化、パフォーマンス向上、そして開発者の作業効率を高めるための多数の新機能が追加された。TypeScript 5.7は、既存の開発フローを大幅に改善する可能性を秘めている。
以下は、TypeScript 5.7で注目すべき改善点を簡潔に紹介する(詳しくはリリースノートをご覧いただきたい)。
1. 未初期化変数のチェック機能の拡張
TypeScript 5.7では、未初期化変数の検出能力が大幅に強化された。従来は、特定の状況で未初期化変数の使用が見逃されることがあったが、新バージョンでは、関数スコープ内で「一度も初期化されていない」変数を厳密にチェックできる。
従来は、以下のコードではresult
が未初期化のまま使用されてもエラーが報告されないケースがあった。
function foo() {
let result: number;
function printResult() {
console.log(result); // エラーが出ない
}
}
TypeScript 5.7では、未初期化の変数を使用した場合に適切なエラーが報告される。
```ts
function foo() {
let result: number;
function printResult() {
console.log(result); // エラー: 'result' は初期化されていない
}
}
この改善により、潜在的なバグをさらに早期に検出できるようになった。
2. 相対パスの再書き換え機能
これまで、.tsファイルを直接実行できるツール(ts-node、Denoなど)とビルド後の.jsファイルを利用する環境の両立は課題だった。TypeScript 5.7では、 --rewriteRelativeImportExtensions
オプションにより、.ts拡張子を自動的に.jsに変換する機能が導入された。
機能の動作例
以下の設定を追加すると、相対パスの拡張子が自動的に書き換えられる。
{
"compilerOptions": {
"rewriteRelativeImportExtensions": true
}
}
// 入力コード
import * as foo from "./foo.ts";
// 出力コード
import * as foo from "./foo.js";
制約事項
- 動的インポート(例:import(getPath()))は再書き換えの対象外である。
- TypeScriptのbaseUrlやpathsを使用したパスも再書き換えの対象外となるため、適切なパス設定が求められる。
3. --target es2024および新しいライブラリのサポート
ECMAScript 2024をターゲットにした--target es2024が追加され、最新の仕様に対応した--lib es2024も利用可能になった。これには以下のような新機能が含まれる。
- Promise.withResolvers
- Object.groupByおよびMap.groupBy
- SharedArrayBufferとArrayBufferの型分岐
例えばTypedArrayがジェネリクス型をサポートし、バッファータイプを明示的に指定可能になった。
interface Uint8Array<TArrayBuffer extends ArrayBufferLike = ArrayBufferLike> {
// ...
}
4. tsconfigファイルの検索ロジックの改善
これまでは、最初に見つかったtsconfig.jsonで検索が停止していた。TypeScript 5.7では、エディタがプロジェクト構成をより柔軟に解釈し、適切な設定ファイルを検出できるよう改良された。
従来は以下のプロジェクト構成において、テスト用のtsconfig.test.jsonが無視されることがあったが、新バージョンでは全てのtsconfig.jsonを階層的に探索し、適切な設定ファイルを選択できるようになった。
project/
├── src/
│ ├── tsconfig.json
│ └── tsconfig.test.json
└── tsconfig.json
5. V8コンパイルキャッシュの活用による速度向上
Node.js 22の新しいコンパイルキャッシュAPIを活用し、TypeScriptのコンパイル速度が劇的に向上した。
tsc --version
を用いた以下のベンチマークでは、キャッシュなしの場合は平均122ms、キャッシュありの場合は平均48msと、従来の2.5倍速くなったと報告されている。
Benchmark 1: node ./built/local/_tsc.js --version (*without* caching)
Time (mean ± σ): 122.2 ms ± 1.5 ms [User: 101.7 ms, System: 13.0 ms]
Range (min … max): 119.3 ms … 132.3 ms 200 runs
Benchmark 2: node ./built/local/tsc.js --version (*with* caching)
Time (mean ± σ): 48.4 ms ± 1.0 ms [User: 34.0 ms, System: 11.1 ms]
Range (min … max): 45.7 ms … 52.8 ms 200 runs
Summary
node ./built/local/tsc.js --version ran
2.52 ± 0.06 times faster than node ./built/local/_tsc.js --version
詳細はAnnouncing TypeScript 5.7を参照していただきたい。