TypeScriptの主任プログラムマネージャーであるDaniel Rosenwasser氏は先日、TypeScript 5.4のベータ版リリースを発表した。TypeScript 5.4では、型推論が改善され、新しいNoInfer
ユーティリティ型が追加されたほか、いくつかの変更点がある。
TypeScript 5.4のベータ版では、クロージャで絞り込まれる一部の型の型推論が改善された。
function getUrls(url: string | URL, names: string[]) {
if (typeof url === "string") {
url = new URL(url);
}
return names.map(name => {
url.searchParams.set("name", name)
// ~~~~~~~~~~~~
// error!
// Property 'searchParams' does not exist on type 'string | URL'.
return url.toString();
});
}
上記のコードでは、map
のarrow関数のクロージャ内のurl
変数は必然的にURL型である。以前のバージョンのTypeScriptでは、getUrls
関数のシグネチャのように、url
の型をstring | URL
と推測していた。リリースされたベータ版では、arrow関数は常にURLオブジェクトのurl
への最後の代入の後に生成され、その結果url
がURL
型であると推論されることを正しく理解している。
一部の開発者はTwitterでこの推論の改善を賞賛した。
もしこれらの型絞り込みの変更が見た目通り良いものであれば、これは大きな改善であり、不要なif文や
!
演算子などを大幅に削減できます。(出典)
クロージャのPreserved Narrowingはとても役に立ちそうです。(出典)
詳細はリリースノート(Preserved Narrowing in Closures Following Last Assignments)を参照してほしい。
TypeScript 5.4では、JavaScriptの新しい静的メソッドObject.groupBy
とMap.groupBy
の宣言も追加されている。リリースノートには以下のような注意書きがある。
これらのメソッドにアクセスするには、
target
をesnext
に設定するか、lib
の設定を調整する必要がある。これらのメソッドはいずれ安定したes2024
ターゲットでも利用可能になると期待している。
さらにTypeScriptは、開発者がTypeScriptの型推論をオプトアウトするための新しいNoInfer
ユーティリティ型を提供している。NoInfer
により、開発者は有効だが不要な型への推論をブロックできる。これは、汎用的な型パラメーターを扱う場合に特に有用である。
function createStreetLight<C extends string>(colors: C[], defaultColor?: NoInfer<C>) {
// ...
}
createStreetLight(["red", "yellow", "green"], "blue");
// ~~~~~~
// error!
// Argument of type '"blue"' is not assignable to parameter of type
// '"red" | "yellow" | "green" | undefined'.
前述のコードサンプルでは、TypeScript 5.4はオプションのパラメータdefaultColor
の型としてCを代入しているが、それ以上の推論は行わず、最終的にC
の型を"red" | "yellow" | "green "
と解決している。以前のバージョンのTypeScript(NoInfer
ユーティリティ型を持っていない)では、C
の型は"red" | "yellow" | "green" | "blue"
と推論される。
開発者はマイクロソフトの開発者ブログで、このリリースで精度が向上したことによる変更点を含む、リリースノートの全文を確認できる。リリースノートには、追加の技術的な詳細、例、リリースの機能の全リストが含まれている。
リリースされたベータ版を以下の手順でインストール可能だ。
npm install -D typescript@beta