TypeScript 5.2 リリース候補の発表
8月10日、TypeScriptチームはTypeScript 5.2のリリース候補(RC)を発表した。
TypeScript 5.2の新機能の一覧は以下の通り。
- using宣言と明示的リソース管理の使用
- デコレータメタデータ
- 名前付きと匿名のタプル要素
- ユニオン配列のより簡単なメソッド使用
- TypeScript実装ファイル拡張子を使用した型のみのインポートパス
- オブジェクトメンバーのコンマ補完
- インライン変数のリファクタリング
- 継続的な型互換性の最適化チェック
- 互換性のない変更と正確性の修正
using宣言と明示的リソース管理の使用
この機能の主な目的は、明示的なリソース管理を簡単に実現することである。プログラム内でリソース(例: ファイル、ネットワーク接続)を生成し、使用した後に解放する必要がある場合、この機能を活用することでクリーンアップを簡潔かつ安全に行うことができる。エラーや早期終了に対しても適切に対処しながら、リソースの解放を行うことが可能となる。
この機能のキーポイントは、「using
宣言」と「await using
宣言」。using
宣言を使うことで、明示的なリソース解放を行う変数を宣言し、スコープを抜ける際に自動的にリソースが解放される。これにより、try
/finally
ブロックを使わずに、コードを簡潔に保つことができる。一方、非同期なリソースに対しては、await using
宣言を用いることで、非同期操作の後に解放を待つことが可能となる。
また、一時的なクリーンアップや任意のクリーンアップのために、「DisposableStack
」と「AsyncDisposableStack
」と呼ばれるオブジェクトも導入されている。これらを使用することで、コールバックを登録してリソースの解放を行うことができる。
使用方法:
using
宣言を使う場合、以下のように明示的なリソース解放を行う変数を宣言する。スコープを抜ける際には自動的にリソースが解放される。
export function doSomeWork() {
using file = new TempFile(".some_temp_file");
// ファイルを使用...
if (someCondition()) {
// さらなる作業を行う...
return;
}
}
一方、非同期なリソースの場合は、await using
宣言を用いて解放を待つことができる。
async function func() {
await using a = loggy("a");
await using b = loggy("b");
// ...
}
また、一時的なクリーンアップや任意のクリーンアップを行うために、「DisposableStack
」や「AsyncDisposableStack
」を用いる。これらはコールバックを登録してリソースの解放を行う。
これにより、コードがより簡潔で効率的になり、リソース管理の不備からくる問題を避けることができる。
デコレーターメタデータ
デコレーターメタデータは、、ECMAScriptのデコレーターに関する提案を実装したものであり、デコレーターを使用してクラスにメタデータを追加し、操作することを目的としている。
デコレーターを使用することで、クラスやプロパティなどの要素に関連するメタデータを効率的に管理することができる。デバッグ情報やシリアル化に必要な情報、デコレーターを活用した依存性の注入など、様々な目的でメタデータを付加できる。これにより、コードの柔軟性を高めつつ、効果的な管理が可能となる。
具体的な使用方法は以下の通りだ。まず、メタデータを追加したいプロパティやメソッドに、特定のデコレーター関数を適用する。これにより、その要素に関するメタデータがデコレーターが処理する過程で追加される。
例えば、シリアル化対象となるプロパティには、@serialize
というデコレーターを適用し、そのプロパティがシリアル化される際にメタデータを利用する。
以下は、シリアル化の例を示すコードだ。
import { serialize, jsonify } from "./serializer";
class Person {
firstName: string;
lastName: string;
@serialize
age: number;
@serialize
get fullName() {
return `${this.firstName} ${this.lastName}`;
}
toJSON() {
return jsonify(this);
}
constructor(firstName: string, lastName: string, age: number) {
// ...
}
}
ここで、@serialize
デコレーターを使用して、age
とfullName
プロパティがシリアル化されるように設定している。toJSON
メソッドは、jsonify
関数を呼び出すことで、@serialize
デコレーターが作成したメタデータを活用してシリアル化を行う。
また、この機能はまだ新しく、多くのランタイムではネイティブでサポートされていない可能性がある。そのため、Symbol.metadata
を定義し、コンパイルターゲットをes2022
以下に設定し、lib
設定に"esnext"
または"esnext.decorators"
を含めることで、この機能を利用できるようになる。
その他の変更点に関する詳しい内容は、Announcing TypeScript 5.2 RCを参照していただきたい。