6月21日、マイクロソフトはJavaScriptを基にした言語、TypeScriptの新バージョン5.5を公開した。
以下のような多数の新機能と改善が含まれており、注目に値するアップデートだ。
- 推論される型述語
- 定数インデックスアクセスの制御フローの絞り込み
- JSDoc @import タグ
- 正規表現の構文チェック
- 新しいECMAScript Setメソッドのサポート
- 分離された宣言
- 設定ファイル用の ${configDir} テンプレート変数
- package.jsonの依存関係を参照して宣言ファイルを生成する機能
以下に、新機能の中でも特に注目すべきトピックについて軽く紹介する。
詳細を知りたい方は、Announcing TypeScript 5.5を参照していただきたい。
型述語の推論が可能に
TypeScript 5.5では、filter
関数などで型述語が推論されるようになった。これにより、配列からundefined
を除外した後の型がより正確になる。
function filterBirds(birds: (Bird | undefined)[]): Bird[] {
return birds.filter((bird): bird is Bird => bird !== undefined);
}
このコードでは、filter
がBird
型のみを返すことをTypeScriptが理解し、結果の配列はBird[]
型となる。
オブジェクトへのインデックスアクセス時の型推論が改善
オブジェクトのキーを定数として扱い、そのキーに基づくプロパティの型を正確に推定する機能が強化された。
function getProperty<T, K extends keyof T>(obj: T, key: K) {
if (typeof obj[key] === "string") {
return obj[key].toUpperCase(); // 文字列として扱われる
}
return null;
}
この関数は、obj
のkey
が文字列型の場合にのみ、文字列を大文字に変換する。
JSDoc で @import タグが利用可能に
TypeScript 5.5では、JSDocコメント内での@import
タグがサポートされ、型情報のみをインポートする際の記述が簡略化された。
/**
* @import { SomeType } from "./some-module"
* @param {SomeType} value
*/
function useSomeType(value) {
// 関数の中身
}
この機能により、実行時に存在しない型のみをインポートする場合の記述がクリアになる。
Setの新しいメソッドのサポート
ECMAScript仕様で、Setに追加されたメソッドがTypeScriptに追加された。
let setA = new Set([1, 2, 3]);
let setB = new Set([2, 3, 4]);
let union = setA.union(setB); // {1, 2, 3, 4}
上の例では、二つのセットの和集合を簡単に求めることができる。
正規表現の構文チェック
TypeScript 5.5では、正規表現に対する構文チェックが強化され、より多くの一般的なエラーを検出できるようになった。
let myRegex = /@robot(\s+(please|immediately)))? do some task/;
// error! 不正な')'があります。バックスラッシュでエスケープしましたか?
この新機能により、コード内で正規表現を使用する際の信頼性が向上する。
パフォーマンスとサイズの最適化
TypeScript 5.5では、言語サービスと公開APIのオブジェクトが単一形式化され、ビルド時間が5-8%速くなるなど、パフォーマンスが向上した。また、パッケージのサイズも大幅に削減された。
新しい transpileDeclaration
API
TypeScript 5.5では、単一のソーステキストから宣言ファイルを生成するためのtranspileDeclaration
APIが導入された。これは、特に大規模なプロジェクトにおいて、ファイルの宣言生成を並列化し、ビルドプロセスを加速するのに役立つ。
主要な振る舞いの変更
TypeScript 5.5では、いくつかの古い機能が廃止され、新しい制約が追加された。これにより、コードの整合性が向上し、より現代的なJavaScript機能への移行が促進される。
これらのアップデートは、TypeScriptを使用する開発者にとって多くの利点をもたらし、特に型安全性と開発効率の向上に寄与する。全体の機能や改善点については、Announcing TypeScript 5.5を参照していただきたい。