TypeScriptはTypeScript 3.8のリリースを発表した。型のみのインポートとエクスポート、プライベートフィールド、トップレベルawaitなどが導入されている。
型のインポートとエクスポートはインポート省略(import elision)によって動作する場合も多いが、インポートされたものが型なのか値なのか不明確な場合に曖昧さを発生させていた。型として使用されるインポートのみを含むimportステートメントは、TypeScriptのインポート省略によって削除されるのだ。これらの問題を回避するため、TypeScript 3.8では、型のインポートとエクスポートを行う新しい構文が導入された。
import type { SomeThing } from "./some-module.js";
export type { SomeThing };
import type
ステートメントは型アノテーションおよび宣言に使用する宣言のみをインポートして、トランスパイル中にすべてが必ず削除される。export type
コマンドは型コンテキスのエクスポートのみを指定するもので、同じくTypeScriptの出力からは削除される。クラスのインポートにimport type
を使用した場合、そのクラスを拡張することはできない。
TypeScriptコンパイラに、実行時に使用されないインポートの処理を指定するimportNotUsedAsValues
フラグが新たに導入された。このフラグにremove
、preserve
、error
のいずれかの値を指定することで、型のインポートとエクスポートをより詳細にコントロールすることができる。
EMCAScript private fields proposalは、BloombergとTypeScriptチームの尽力によって先頃ステージ3に到達した。
プライベートフィールドは#文字から始まり、それを含むクラスに対するユニークなスコープを持つ。publicやprivateなどのTypeScript修飾子は使用しない。プライベートフィールドは、それを含むクラスの外側からは、アクセスや検出することはできない。
プライベートフィールドはTypeScriptのprivateキーワードとは違うものだ。TypeScriptチームのプログラムマネージャであるDaniel Rosenwasser氏が、次のように説明する。
プロパティに変換された時、TypeScriptのprivate修飾子は完全に削除されます — つまり、データは存在しますが、そのプロパティがどのように宣言されたのか、JavaScript出力には何もエンコードされていない、ということです。実行時には、完全に通常のプロパティとして動作します。つまり、privateキーワードを使用した場合、プライバシが効力を持つのはコンパイル時/デザイン時のみであって、JavaScriptのコンシューマにとっては、意図としての意味しか持ちません。このような"ソフトプライバシ"の利点としては、一部のAPIにアクセスできない問題を一時的に回避することが可能であり、それが任意のランタイムで動作するという点があげられます。これに対して、ECMAScriptの#プライベートは、クラス外からはまったくアクセスできないのです。
ただし、privateキーワードがES3でも動作するのに対して、プライベートフィールドの変換に関しては、下位互換性のある実装がWeakMapsを活用していることから、現在のTypeScriptではES6以降のみが対象である点には注意が必要だ。
ECMAScript 2020には、モジュールのすべてのメンバをひとつのメンバとして公開するexport *
構文が追加されている。これまでは次のような構文を使用する必要があった。
import * as utilities from "./utilities.js";
export { utilities };
ECMAScript 2020とTypeScript 3.8では次のように省略できる。
export * as utilities from "./utilities.js";
ES6で導入されたpromiseは、JavaScriptの非同期処理を改善する基盤となったが、その最初のリリースから5年間にわたって、async/awaitなど多くの機能が追加されるきっかけにもなっている。その最新のものが、モジュールのトップレベルでawait
が可能になったトップレベルawaitだ。
トップレベルawaitはTypeScripr 3.7でもサポートされるが、トランスパイル対象はES2017以降の環境に限定される。また、ESモジュールをサポートする環境が必要であるため、サポートするモジュールはesnext
とsystem
である。
TypeScript 3.8では、トランスパイルターゲットとモジュールオプションとしてes2020
をサポートする。このモードでは、TypeScript 3.7と3.8で追加されたES2020機能が保持される。
TypeScript 3.8リリースではディレクトリ監視サポートが改善され、新たにwatchOptions
というコンパイラ設定フィールドが追加されている。これらのオプションにより、ディレクトリやファイルの監視をより詳細にコントロール可能になると同時に、node_modules
の変更に対する処理のパフォーマンスと信頼性が向上する。
watchOptions
にはwatchFile
、watchDirectory
、fallbackPolling
、synchronousWatchDirectory
という4つの新たなオプションがあり、それぞれにファイルやディレクトリをチェックする頻度の設定オプションがいくつか用意されている。
TypeScript 3.8コンパイラには、コンパイラパフォーマンスを最適化する新しいオプションとして、変更されたファイルとそれを直接インポートするファイルのみを再チェックおよび再ビルドするように指示するassumeChangesOnlyAffectDirectDependencies
も追加されている。
TypeScriptはリリース毎にコンパイラの型チェック機能が向上しているため、互換性のない変更が導入されている。TypeScript 3.8では、インデックスシグネチャを持つ共用体に対して、より厳密な割当てチェックが追加された。
TypeScriptコミュニティでは、2018年と2019年にシアトルで開催された2回のTSConfイベントに続いて、初めてのTSConf JapanとTSConf.euが2月と3月に開催される予定である。
TypeScriptは、Apache 2ライセンス下で使用可能なオープンソースソフトウェアである。コントリビューションとフィードバックはTypeScript GitHubプロジェクト経由で募集されている。それぞれTypeScriptコントリビューションガイドラインとMicrosoft open-source code of conductへの準拠が必要だ。