TypeScriptチームがTypeScript 4.0のリリースを発表した。待望の可変長タプル型(variadic tuple type)のサポートなどの改善が、大きな非互換的変更を伴わずに導入されている。
リードアーキテクトのAnders Hjelsberg氏は何年も前から、可変長サポートの追加に関する課題について話してきた。タプル型では、2つの配列あるいはタプル型を結合して新たな配列を作るような単純なものの型付けであっても、非常に冗長な型のオーバーロードの発生という課題にすぐ突き当たるのだ。
プログラムマネージャのDaniel Rosenwasser氏が説明する。
TypeScript 4.0では、インターフェースの改善と合わせて、2つの根本的な変更を行うことで、このような型付けを可能にしています。
最初の変更は、タプル型構文のスプレッドがジェネリックになったことです。これはつまり、操作対象の実際の型を知らなくても、タプルや配列に対してハイオーダな操作が表現できるようになった、ということです。ジェネリックなスプレッドがこのようなタプル型にインスタンス化(あるいは実際の型に置き換え)される場合に、他の配列セットやタプル型を生成できます。ふたつめの変更は、残余要素(rest elemets)をタプルの任意の場所に — 最後だけでなく! — 配置できるようになったことです。
これらの変更が相まって、"1,000オーバーロードによる死"であったものが、比較的簡単な関数シグネチャになっています。
type Arr = readonly any[];
function concat<T extends Arr, U extends Arr>(arr1: T, arr2: U): [...T, ...U] {
return [...arr1, ...arr2];
}
この例以外でも、残余パラメータや残余型要素の型推論プロセスにより、引数の部分的な適用に対するサポートが容易になる。可変長タプル型は一般的に、関数の構成を大きく改善する。
タプル型とパラメータリストが改善されることで、これまで型付が困難だった通常のJavaScriptプラクティスについても、強力な型検証が可能になる。これには引数リストの操作や、それらを他の関数に渡す操作も含まれている。
TypeScript 4.0で追加されたもうひとつの大きな機能は、コンストラクタからのクラスプロパティ推論である。noImplicitAny
フラグが有効な場合、TypeScriptのコントロールフロー分析がクラス内のプロパティの型を判断する。
TypeScriptでは新たに"&&=
"、"||=
"、"??=
"という3つの代入演算子 で、新しいECMAScript機能をサポートする。これらの演算子は、論理およびNULL合体演算子による複合代入(身近な例では"+=
"など)をサポートすることで、JavaScriptとTypeScriptとのギャップを埋める働きをする。
これらの演算子が副作用を持つgetterやsetterで使用される場合、オペレータは必要に応じて代入のみを実行するようになる。
Try/CatchステートメントもTypeScript 4.0の改善点のひとつだ。これまでcatch句の変数は、any
に型付されることがほとんどだったが、今後は、より正確にunknown
と型付する必要があり、値を実際に操作する前に型チェックが必要なことを開発者に連想させるようになる。
TypeScript 4.0では、インクリメンタルビルドに続いて--noEmitOnError
を使用することで、ビルドモードの実行時間が改善されている。これまでは、前回のインクリメンタルコンパイルからの情報がキャッシュされていなかったため、結果としてコンパイルに時間がかかっていた。同じように、インクリメンタルビルドでは--noEmit
フラグを使用できるようになった。
TypeScript Language Serviceをサポートするエディタでは、一般的なパターンを、TypeScript 3.7で追加された最新のTC39機能であるオプショナルチェイニング(optional chaining)やNULL合体(nullish coalescing)演算子などを使うように、リファクタリングするオプションが使用できるようになる。
非常に大規模なコードベースで作業する場合、TypeScriptコンパイラがコードベース全体に対して動作するため、ユーザはこれまで起動時間の遅さを経験していた。Visual Studio CodeのTypeScript 4.0では、スタートアップ時に部分意味(partial semantic)モードをサポートすることで、スタートアップ時間が大幅に短縮されている。
TypeScript 4.0では、少数の小さな非互換的変更が導入されている。標準lib.d.ts
宣言の変更の中には、self.origin
に代わることで、ブラウザ標準によって廃止されたdocument.origin
の削除が含まれている。 その他の非互換的変更としては、プロパティをオーバーライドするアクセサが常にイシュー及びエラーになるようになったこと、StrictNullChecks
を使う場合のdelete
演算子のオペランドがany
、unknown
、never
のいずれかか、あるいはオプションでなければならないこと、などがある。
最後に、AST Nodeを生成するTypeScript Nodeファクトリ関数に、これまでのAPIに代わる新たなノードファクトリAPIが用意されている。
これら非互換変更の詳細については、TypeScript 4.0のリリースブログを参照してほしい。
TypeScriptの人気は高まり続けている。npmからは毎月5,000万以上がダウロードされ、StackOverflowの調査ではTypeScriptが"most-loved language"の第2位に選ばれた。
TypeScript 4.1に向けた開発作業もすでに始まっており、2020年11月のリリースが期待されている。TypeScript 4.1リリースの目標には、再帰的コンディショナルタイプ(recursive conditional types)、マップ型(mapped types)のキー拡張、Node.jsにおけるESモジュールの相互運用性、最新のTC39 export * as default
の追加などが含まれる他、WebAssemblyモジュールから型情報を直接引用する機能も含まれる可能性がある。
TypeScriptユーザは、2020年10月9日に開催される、初のオンラインTSConfにぜひ参加してほしい。TypeScriptチームやTypeScriptコミュニティ全般のメンバによるセッションが行われる予定だ。
TypeScriptは、Apache 2ライセンスで公開されているオープンソースソフトウェアである。コントリビューションやフィードバックはTypeScript GitHubプロジェクト経由で受け付けている。それぞれTypeScript contribution guidelineおよびMicrosoft open-source code of conductに従うことが条件だ。