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