BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース プライベートフィールドとトップレベルawaitを追加したTypeScript 3.8

プライベートフィールドとトップレベルawaitを追加したTypeScript 3.8

原文(投稿日:2020/02/20)へのリンク

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フラグが新たに導入された。このフラグにremovepreserveerrorのいずれかの値を指定することで、型のインポートとエクスポートをより詳細にコントロールすることができる。

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モジュールをサポートする環境が必要であるため、サポートするモジュールはesnextsystemである。

TypeScript 3.8では、トランスパイルターゲットとモジュールオプションとしてes2020をサポートする。このモードでは、TypeScript 3.7と3.8で追加されたES2020機能が保持される。

TypeScript 3.8リリースではディレクトリ監視サポートが改善され、新たにwatchOptionsというコンパイラ設定フィールドが追加されている。これらのオプションにより、ディレクトリやファイルの監視をより詳細にコントロール可能になると同時に、node_modulesの変更に対する処理のパフォーマンスと信頼性が向上する。

watchOptionsにはwatchFilewatchDirectoryfallbackPollingsynchronousWatchDirectoryという4つの新たなオプションがあり、それぞれにファイルやディレクトリをチェックする頻度の設定オプションがいくつか用意されている。

TypeScript 3.8コンパイラには、コンパイラパフォーマンスを最適化する新しいオプションとして、変更されたファイルとそれを直接インポートするファイルのみを再チェックおよび再ビルドするように指示するassumeChangesOnlyAffectDirectDependenciesも追加されている。

TypeScriptはリリース毎にコンパイラの型チェック機能が向上しているため、互換性のない変更が導入されている。TypeScript 3.8では、インデックスシグネチャを持つ共用体に対して、より厳密な割当てチェックが追加された。

TypeScriptコミュニティでは、2018年と2019年にシアトルで開催された2回のTSConfイベントに続いて、初めてのTSConf JapanTSConf.euが2月と3月に開催される予定である。

TypeScriptは、Apache 2ライセンス下で使用可能なオープンソースソフトウェアである。コントリビューションとフィードバックはTypeScript GitHubプロジェクト経由で募集されている。それぞれTypeScriptコントリビューションガイドラインMicrosoft open-source code of conductへの準拠が必要だ。

この記事に星をつける

おすすめ度
スタイル

特集コンテンツ一覧

BT