TypeScript4.7ベータ版がリリース
Microsoft社が、現地時間2022年4月8日にTypeScriptのバージョン4.7のベータ版を公開しました。その中でインスタンス化表現という新しい記法が面白そうだったので紹介します。
インスタンス化表現
インスタンス化表現とは、簡単に言えばジェネリック関数を特化した関数の型を、スマートに宣言できるようにしたものです。
例えば以下のようなmakeBoxというジェネリック関数があったとします。
makeBox.ts
function makeBox<T>(value: T) {
return { value };
}
この関数は引数に渡した値を包むオブジェクトを返す関数です。この関数をもとに、引数の型を特定の型に制限したものを作ろうとした場合、今まではラップした関数を宣言するか、ラッパーをエイリアスとして明示的な型で宣言する必要がありました。
superMakeBox.ts
function makeHammerBox(hammer: Hammer) {
return makeBox(hammer);
}
// or...
const makeWrenchBox: (wrench: Wrench) => Box<Wrench> = makeBox;
インスタンス化表現ではラッパーを記述することなく、ジェネリック関数と型引数だけで、エイリアスを簡潔に表現できます。インスタンス化表現ではこれまでのラッパーのコードをこう記述できます。
newSuperMakeBox.ts
const makeHammerBox = makeBox<Hammer>;
const makeWrenchBox = makeBox<Wrench>;
const makeStringBox = makeBox<string>;
makeStringBox(42);
この表現方法はArray型やMap型でも使用することが出来ます。
errorOnlyMap.ts
// Has type `new () => Map<string, Error>`
const ErrorMap = Map<string, Error>;
// Has type `// Map<string, Error>`
const errorMap = new ErrorMap();
この機能はまだベータ版のみの機能ですが、ジェネリック関数の特化を行うときに、より簡潔で宣言的に記述することが出来ます。TypeScriptの規範である宣言的という枠から外れずに、今までより簡潔に記述できるようになったのはとても素晴らしい変更だと思います。バージョン4.7が正式にリリースされたら積極的に利用していきたいですね。