TypeScriptチームがTypeScript 3.4のリリースを発表した。高速化されたインクリメンタルビルド、より高次の型推論を実現するためのジェネリック関数の改良、ES.Next globalThis
のサポートなどが含まれている。
TypeScriptはここ数年の間に、その効率性と、型定義の表現と推論における人間工学において大きく進歩した。最新のTypeScript 3.4では、機能強化により、関数が他のジェネリック関数から型を推論できるようになった。このリリースより前は、他のジェネリック関数が渡された場合、パラメータや型の情報が失われることから,ジェネリック関数での型推論は難しかった。プログラムマネージャの Daniel Rosenwasser氏が次のように説明する。
関数型を返すジェネリック関数呼び出しの型引数の推論において,TypeScriptは,必要に応じてジェネリック関数の引数から結果の関数型への型パラメータの伝搬を行います。
TypeScript 3.4では、読み取り専用の配列ライク(array-like)型などの扱いに関する操作性も向上している。これまではReadonlyArray
型が必要だったのだが,このために配列の定義時には,より一般的な記法である[]
省略構文が使用できなくなっていた。今回のリリースで,配列の前に配置するreadonly
修飾子が使用可能になった。各項目が文字列である配列であれば,"readonly string[]
"というようにreadonly
を定義できる。readonly
修飾子はタプルでも,例えば"readonly [string, number]
"のように使用可能である。
従来バージョンのTypeScriptでは,Readonly
ユーティリティ型などのマップ型は配列型およびタプル型には機能しなかったが、TypeScript 3.4では,マップ型にreadonly
修飾子を使用すると,対応するreadonly
な配列ライク型に自動的に変換されるようになった。
変更可能な変数やプロパティが宣言された場合,TypeScriptでは通常,明示的な型定義のない設定値が代入できるように値の幅が拡張される。この時、Rosenwasser氏が説明するような問題がある。
JavaScriptのプロパティは,デフォルトで変更可能です。これはつまり,不必要な型の拡張が頻繁に行われるということであり、場合によっては明示的な型宣言が必要になります。この問題を解決するためにTypeScript 3.4では,
const
アサーションと呼ばれる,リテラル値によるコンストラクタが新たに用意されました。構文としては,型名の代わりにconst
を使って型を定義します(例:123 as const
)。
const
アサーションを使った新たなリテラル式によって,式中のリテラル型の型定義を拡張しないこと,オブジェクトリテラルがreadonly
プロパティを受け取ること,配列リテラルがreadonly
タプルになることをTypeScriptに伝えることができる。
かねてからJavaScriptに望まれていたもののひとつに,グローバルコンテキスト参照のための標準形式というものがある。既存の実装がさまざまなライブラリを使用していたため,ソリューションの決定には数年を要した。JavaScriptの今後の機能追加を定義するグループであり,そのプロセス名でもあるTC39はglobalThis
を選択し,現在ステージ3サポートに達している。これはTypeScriptに新機能を追加する前に待機するレベルである。globalThis
は,アプリケーションの現在の状態に関係なく,グローバルなコンテキストを提供する。
現時点でglobalThis
を利用するアプリケーションの大部分は、globalThis
polyfillを使用して,古いブラウザやJavaScriptエンジンをサポートする必要がある。変更による影響のひとつとして,TypeScriptのnoImplicitAny
モードで動作する場合のトップレベルのthis
は,any
からtypeof globalThis
に変更された。グローバルコンテキストの使用方法を更新するための時間を確保するまでは,noImplicitThis
フラグを使用して,この問題を回避することになる。
TypeScriptのコンパイル時間を改善するためにTypeScript 3.4では,新たに--incremental
フラグを用意して,最後のコンパイル時のプロジェクトグラフ情報を保存可能にした。この情報は,プロジェクトの型チェックと変更の検出を最速で実行する手段として使用され,以降のコンパイル時間を大幅に削減する。Rosenwasser氏は,Visual Studio Codeのビルドタイプを調査した結果として、パフォーマンスの改善を説明する。
Visual Studio Codeのような規模のプロジェクトでは、TypeScriptの新しい
--incremental
フラグを使うことで、2回目以降のビルド時間が最初の約5分の1に短縮されます。
TypeScript 3.4には潜在的に互換性を損なう変更もいくつかあるが、それらはすべて新機能を使用した場合である。例えば、コードベースがジェネリック型引数の型伝搬を前提にしていなければ、TypeScript 3.4を使用する場合には、コンパイルエラーにならないように修正する必要がある。
TypeScriptチームはすでにTypeScript 3.5用の機能を開発中で、TSLintからESLintへの移行、否定型(negated type)を含む言語とコンパイラの改良などに取り組んでいる。
TypeScriptコミュニティもまた、第2回のTSConfを10月11日に開催すると発表しており、TypeScript創設者であるAnders Hejlsberg氏が基調講演を行う予定だ。
TypeScriptは,Apache 2ライセンス下で利用可能なオープンソースソフトウェアである。コントリビューションやフィードバックはTypeScript GitHubプロジェクトを通じて募集されている。いずれもTypeScriptコントリビューションガイドラインおよびMicrosoftオープンソースコード規範に従うことが必要だ。