検索
ニュース

「TypeScript 4.9 RC」が公開、気になる機能改善の詳細は?安定版の公開は2022年11月中旬の見通し

MicrosoftがRC(リリース候補)を公開した「TypeScript 4.9」では、「in」演算子や「satisfies」演算子など、さまざまな機能改善が行われている。

Share
Tweet
LINE
Hatena

 Microsoftは2022年11月1日(米国時間)、オープンソースのプログラミング言語の最新版「TypeScript 4.9」のRelease Candidate(RC:リリース候補)を公開した。TypeScript 4.9は今後、安定版の公開まで、重要なバグの修正以外の変更は行われない。安定版の公開は2022年11月15日ごろになる見通しだ。

 TypeScript 4.9では、「in」演算子による未知のプロパティの絞り込みチェックや、「satisfies」演算子など、さまざまな機能改善が行われている。

 TypeScriptは静的型付けができる言語であり、JavaScriptのスーパーセットだ。ECMA規格に従った最新のJavaScriptの機能を、古いWebブラウザやランタイムが扱えるようにコンパイルもできる。

 TypeScript 4.9 RCは、NuGetを使うか、次のコマンドラインのように、npmを使ってインストールできる。

npm install -D typescript@rc

 TypeScript 4.9は「Visual Studio 2022」と「Visual Studio 2019」のエディタでサポートされており、「Visual Studio Code」(以下、VS Code)でも利用できる。TypeScript 4.9の主な新機能は次の通り。

TypeScript 4.9の主な新機能

satisfies演算子

 「satisfies」演算子を使うと、式の型を変更することなく、式の型がある型と一致するかどうかを検証できる。例えば、「palette」の全てのプロパティが「string | number[]」と互換性があることを検証するために、satisfiesを使用できる。

 satisfies は、起こり得るさまざまなエラーを検出するために使用できる。例えば、あるオブジェクトがある型の全てのキーを持ち、それ以外のキーを持たないことを確認することが可能だ。

 プロパティ名が一致するかどうかは気にしないが、各プロパティの型は気にする、という場合もあるかもしれない。その場合、オブジェクトの全てのプロパティ値が何らかの型に適合していることを確認することもできる。

in演算子で非列挙プロパティを絞り込み

 開発者はしばしば、実行時に完全には分からない値を扱う必要がある。例えば、サーバからの応答を得るときや、設定ファイルを読み取るときなど、プロパティが存在するかどうか分からないことがよくある。JavaScriptの「in」演算子は、オブジェクトにプロパティが存在するかどうかをチェックできる。

 TypeScript 4.9では、プロパティを全く列挙していない型を絞り込む際に、in演算子がこれまでより強力な機能を発揮するようになった。すなわち、これらの型をそのままにするのではなく、「Record<"property-key-being-checked", unknown>」と交差させるようになった。

 下の例では、「packageJSON」は、型が「unknown」から「object」「object & Record<"name", unknown>」に絞り込まれる。これにより、「packageJSON.name」に直接アクセスし、それを独立して絞り込むことが可能になる。

 TypeScript 4.9では、inの使い方に関する幾つかのチェックも強化され、左側が文字列|数値|記号の型に割り当て可能であること、右側がオブジェクトに割り当て可能であることが確認されるようになった。これは、有効なプロパティキーを使っているか、プリミティブを誤ってチェックしていないかを確認するのに役立つ。

クラスでの自動アクセサ

 TypeScript 4.9は、ECMAScript規格の新機能である自動アクセサをサポートしている。自動アクセサは、クラスのプロパティと同じように宣言されるが、「accessor」キーワードで宣言される点が異なる。

 これらの自動アクセサは、到達不可能なプライベートプロパティを持つ「get」および「set」アクセサに“脱糖”しているといえる。

NaNに対する等値性チェック

 組み込みの等式演算子を使って「NaN」という値に対してチェックすることは、JavaScript開発者にとって大きな落とし穴だ。NaNは、「Not a Number」(数値演算ができない状態)を表す特殊な数値だ。NaNと等しいものはなく、全てのものは常にNaNと等しくない。

 JavaScriptの主要な数値型は浮動小数点数であり、JavaScriptにおける数値解析では、しばしばNaNが発生する。そのため、NaNに対するチェックはかなり一般的になっており、正しい方法は「Number.isNaN」を使うことだが、多くの人が、誤って「someValue === NaN」でチェックしてしまう。

 TypeScript 4.9は、NaNとの直接比較でエラーを出し、代わりにNumber.isNaNのバリエーションの使用を推奨するようになった。

 この変更は、TypeScriptがオブジェクトや配列リテラルとの比較でエラーを発行するのと同じように、初心者のエラーをキャッチするのに役立つだろうと、Microsoftは述べている。

ファイルシステムイベントでファイルを監視

 TypeScriptはこれまで、個々のファイルを監視するために主にポーリングを使用していた。だが、TypeScript 4.9では、ファイル監視は既定でファイルシステムイベントに基づいて行われ、イベントベースの監視を設定できなかった場合にのみ、ポーリングにフォールバックするようになった。

 これにより、「--watch」モードで実行したり、Visual StudioやVS CodeのようなTypeScript対応のエディタで実行したりする際に、リソース消費が抑えられるだろうと、Microsoftは述べている。

 ファイル監視の動作は、環境変数と「watchOptions」で設定できる。

使っていないインポートを削除するエディタコマンド

 これまでTypeScriptは、インポートを管理するための2つのエディタコマンドをサポートしていた。1つは、使われていないインポートを削除し、残ったインポートを並べ替えるもの。もう1つは、ファイル内のインポートを並べ替えるだけで、削除はしないものだ。

 TypeScript 4.9では、使われていないインポートの削除のみを行う機能が追加された。TypeScriptは、使われていないインポート名とステートメントを削除するが、残ったインポートの相対的な順序はそのままにしておく。

returnキーワードで定義に移動

 エディタで、「return」キーワードで「定義に移動」機能を実行すると、対応する関数の先頭にジャンプするようになった。これは、returnがどの関数に属しているかを素早く把握するのに役立つ。

 今後、「await」や「yield」、あるいは「case」や「default」といったキーワードに関しても、似た機能が提供されるようになる見込みだ。

パフォーマンスの向上

 TypeScript 4.9のパフォーマンス改善の中で、注目すべきものが2つある。1つは、TypeScriptの「forEachChild」関数が、全ての構文ノードでswitch文の代わりに関数テーブルの検索を使うように書き換えられたことだ。forEachChildは、言語サービスの一部とともにコンパイラのバインディング段階で多用されている。forEachChildのリファクタリングにより、バインディング段階と言語サービス操作にかかる時間が、最大で20%短縮された。

 もう1つの注目すべき改善は、TypeScriptが条件付き型の真のブランチで型情報を保持する方法が最適化されたことだ。以下のような型では、

 TypeScriptは、「Zoo<A>」が有効かどうかをチェックする際に、「A」も「Animal」でなければならないことを「覚えて」おく必要がある。これは基本的に、AとAnimalの交点を保持する特殊な型を作成することで行われる。

 TypeScriptはこれまで、これを積極的に行っていたが、それは必ずしも必要なことではなかった。さらに、型チェッカには欠陥のあるコードがあり、これらの特殊な型を簡略化することを妨げていた。

 TypeScript 4.9ではこうした型の交差を、必要になるまで先送りするようになった。これにより、条件付き型を多用するコードベースでは、TypeScriptで大幅なスピードアップが見られる可能性がある。ただし、TypeScriptチームのパフォーマンステストでは、型チェック時間の短縮率は3%にとどまった。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る