Microsoftは「TypeScript 4.6」を公開した。型推論や構文エラーのチェックなど多くの機能が追加、改善され、パフォーマンスも向上している。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
Microsoftは2022年2月28日(米国時間)、オープンソースのプログラミング言語の最新版「TypeScript 4.6」を公開した。
コンストラクタにおけるsuper()の前でのコード実行や、分割された判別可能なユニオンの制御フロー解析など、多くの機能追加や改良が行われ、生産性やパフォーマンスが向上している。
TypeScriptは静的型付けができる言語であり、JavaScriptのスーパーセットだ。ECMA規格に従った最新のJavaScriptの機能を、古いWebブラウザやランタイムが扱えるようにコンパイルすることもできる。
TypeScriptは、NuGetを使うか、次のコマンドラインのように、npmを使ってインストールできる。
npm install typescript
TypeScript 4.6は「Visual Studio 2022」と「Visual Studio 2019」のエディタでサポートされており、「Visual Studio Code」(以下、VS Code)と「Sublime Text 3」でも利用できる。TypeScript 4.6の主な特徴は次の通り。
コンストラクタで「this」が参照される前に「super()」が参照されることを保証するチェックが緩やかになった。これにより「super()」の前で他のコードを実行できる。従来はこのチェックが厳しかったため実行は不可能だった。
TypeScriptは、プロパティの内容に基づいて型を絞り込める。例えば、次のコードでは、「kind」の値をチェックするたびに、「action」の型を絞り込めるようになっている。
これにより、異なるデータを保持できるオブジェクトを扱える。共通のフィールドによって、これらのオブジェクトがどのデータを持っているかが分かる。
TypeScriptのような型推論を備えた言語では一般的だが、上記例の「kind」と「payload」を次のように分割することもできる。
従来のTypeScriptはこれらをエラーにしていたが、TypeScript 4.6ではそのまま機能するようになった。
個々のプロパティを「const」宣言に分割したり、パラメーターを、代入されない変数に分割したりすると、TypeScriptは、分割された型が判別可能なユニオンかどうかをチェックする。判別可能なユニオンである場合、TypeScriptは他の変数のチェックに応じて変数の型を絞り込める。上記例の場合「kind」のチェックで「payload」の型を絞り込む。
TypeScriptは、ジェネリクスも提供する構造的な型システムに基づいて構築されている。構造的な型システムでは、オブジェクト型の互換性は、メンバーに基づいている。
「Source」が「Target」と互換性があるかどうかは、プロパティが代入可能かどうかに関係する。上記例の場合、それは「prop」だ。これにジェネリクスを導入すると、答えにくい問題が出てくる。次のようなコードの場合「Source<string>」は「Target<number>」に代入可能か、だ。
この問題に答えるには、TypeScriptは、「prop」の型に互換性があるかどうかをチェックする必要がある。つまり、「Source<Source<string>>」は「Target<Target<number>>」に代入可能か、が問題になる。TypeScriptはこの問題を解決するため「prop」がそれらの型に互換性があるかどうかをチェックし「Source<Source<Source<string>>>」が「Target<Target<Target<number>>>」に代入可能かどうかをチェックすることになる。掘り下げれば掘り下げるほど、型が無限に展開されていくことに気付くだろう。
そこでTypeScriptは特定の深さまでチェックしたのちに、型が無限に展開されるように見えた場合、その型は互換性がある可能性があると判断していた。だが、この判断に偽陰性が存在した。
TypeScript 4.6はこうしたケースを区別できるようになり、上記例では最後の部分で正しくエラーが出力されるようになった。TypeScriptは型が無限に展開されることをより早く検知できるようになり、型の互換性をチェックするのにかかる時間を大幅に軽減した。「redux-immutable」「react-lazylog」「yup」のようなライブラリでは、チェック時間が50%短縮された。
processRecordの呼び出しの中で型アサーションが不要になった。これによりオブジェクト型に即座にインデックスを付けるインデックスアクセス型を正しく推論できるようになった。
シグネチャは、型がタプルの判別可能なユニオンであるレストパラメーター(残余引数)で宣言できる。
これは、funcの引数が最初の引数に完全に依存することを意味する。最初の引数が文字列「"str"」である場合、第2引数は「string」でなければならない。最初の引数が文字列「"num"」である場合、第2引数は「number」でなければならない。
こうしたシグネチャから関数の型を推論する場合、TypeScriptは、相互に依存するパラメーターを絞り込めるようになった。
TypeScriptの「--target」オプションが「es2022」に対応し、クラスフィールドのような機能が、安定した出力先で保持されるようになった。また「Array」の「at()」メソッド、「Object.hasOwn」「new Error」の「cause」オプションなどの新しい組み込み機能が、この新しい「-target」設定と「--lib es2022」で使用できるようになった。
以前は、次のようなコードを「--jsx react-jsx」でコンパイルする場合、
TypeScriptは次のようなJavaScriptコードを生成した。
最後の「void 0」引数はこのemitモードでは不要であり、これを削除することで、バンドルサイズが改善される。
TypeScriptは、TypeScriptファイルで関数とそのJSDocコメントの間でパラメーター名が一致しない場合、それをエディタに表示するようになった。
JavaScriptファイルにおける構文エラーとバインディングエラーのセットが拡張された。Visual StudioやVisual Studio CodeのようなエディタでJavaScriptファイルを開いた場合や、TypeScriptコンパイラでJavaScriptコードを実行した場合、「checkJs」を有効にしたり、ファイルの先頭に「// @ts-check」というコメントを追加したりしなくても、これらの新しいエラーが表示されるようになった。
Copyright © ITmedia, Inc. All Rights Reserved.