BT

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

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Omitタイプを追加し、ユニオン型チェックを改善したTypeScript 3.5

Omitタイプを追加し、ユニオン型チェックを改善したTypeScript 3.5

原文(投稿日:2019/06/17)へのリンク

TypeScriptチームは、型チェックのパフォーマンスを改善し、新たにOmitタイプを備えたTypeScript 3.5のリリースを発表した。

TypeScript 3.4で、TypeScriptは新たに"--incremental"フラグを導入した。 このフラグは、最後のコンパイル時のプロジェクトグラフ情報を保存することで、型チェックの最速の方法を検出してプロジェクト変更を実施することで、その後のコンパイル時間を短縮するものだ。TypeScriptプログラムマネージャのDaniel Rosenwasser氏の説明によれば、TypeScript 3.5では、このアプローチが改善されている。

TypeScript 3.5では、コンパイラの設定、ファイルが参照された理由、ファイルの見つかった場所など、全体の状態の計算方法をキャッシュするために、いくつかの最適化手法が導入されました。"--build"モードにおいて、TypeScriptのプロジェクト参照を使用する数百のプロジェクトが関与するようなシナリオでは、TypeScript 3.4と比較して、再構築にかかる時間を68パーセントも短縮することができるのです!

総合的な型チェック時間を短縮して、3.4で発生した一部の型チェックパフォーマンス低下に対処するため、TypeScriptチームは、コードパスと機能の最適化に注目した。その結果、インクリメンタルな型チェックの多くにおいて、TypeScript 3.5はTypeScript 3.3よりも高速になった。これによってコンパイラ時間が短縮されると同時に、コード補完などのエディタ操作も高速に動作するようになっている。

一般的なTypeScriptのパターンでは、別のオブジェクトから特定のプロパティを省略して、新たなオブジェクトを作成する。これまでは通常、開発者がPickヘルパやExcludeヘルパを組み合わせて、除外パターンを定義していたが、TypeScript 3.5リリースでは、新たにOmitタイプが追加されている。TypeScriptチームの提供する例では、locationプロパティのないPersonを定義するプロセスを、TypeScript 3.5リリース前と後とで示している。

OmitのなかったTypeScript 3.4では、

type Person = {
    name: string;
    age: number;
    location: string;
};

type RemainingKeys = Exclude<keyof Person, "location">;

type QuantumPerson = Pick<Person, RemainingKeys>;

// equivalent to
type QuantumPerson = {
    name: string;
    age: number;
};

Omitの導入されたTypeScript 3.5では、

type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;

Omitおよび他の組み込みヘルパタイプは、lib.d.tsを通じて使用することができる。

TypeScriptは、オブジェクトリテラルに対する過剰プロパティ(excess property)のチェックをサポートする。これにより、型で予期しないプロパティが含まれている場合、タイプミスとして検出することができる。これまでのバージョンでは、オブジェクトリテラルのnameプロパティなど、一部の余分なプロパティが許可されていた。これは、非判別共用体(non-discriminated union)では、メンバに対して過剰プロパティのチェックを実行しないためだ。TypeScript 3.5では、提供されたすべてのプロパティが、何らかのユニオンメンバと適切な型に属していることを検証するようになった。

TypeScript 3.5では、ユニオン型のチェックが改善されている。ユニオン型に対するチェックでは、TypeScriptは通常、各構成要素型を分離して比較する。従来のバージョンでは、型定義が十分に具体的でない場合、型チェックに失敗することがあった。例えば、ひとつのメンバがtrueまたはfalseの値を許容し、別のメンバが同じプロパティをブール値として許容している場合、この比較は失敗する。TypeScript 3.5では、型を、使用可能な型の和集合に分解するようになった。booleanはtrueとfalseの和集合と見なされるので、この例では型チェックが成功する。

TypeScript 3.4では、他のジェネリック関数から型を推測する関数のサポートが導入されたが、TypeScript 3.5はこれを一般化して、コンストラクタ関数でも機能するようにした。ジェネリックコンストラクタに関するこの新しい推論により、Reactなど一部のUIライブラリのクラスコンポーネントで動作する関数が、ジェネリッククラスコンポーネントでより正確に動作するようになる。

TypeScript 3.5のその他の新機能としては、"--allowUmdGlobalAccess"フラグ、エディタが構文を認識してテキスト選択を外側に拡張するためのSmart Select API、ローカル型エイリアスに型を抽出するリファクタリングなどがある。

TypeScript 3.5では、潜在的に重大な変更も導入されているが、すべて新機能を使用した場合である。

  • ジェネリック型パラメータは、暗黙的に不明(unknown)に制約される
  • { [k: string]: unknown }が、ワイルドカードの割り当て対象ではなくなった
  • インデックス付きアクセスタイプへの不適切な書き込みの修正
  • Object.keysがES5のプリミティブを受け入れなくなった
  • lib.d.tsにOmitヘルパタイプが追加された

TypeScriptチームはすでに、TypeScript 3.6に向けた機能に取り組んでいる。ジェネレータとイテレータの改善、ECMAScriptのプライベートクラスフィールドのサポート、コンパイラ、インフラストラクチャ、エディタの改善などだ。

TypeScriptコミュニティは、10月11日に開催される題2回のTSConfイベントの準備も行っており、TypeScriptの創始者であるAnders Hejlsberg氏が基調講演を行う予定である。

TypeScriptは,Apache 2ライセンス下で利用可能なオープンソースソフトウェアである。コントリビューションやフィードバックはTypeScript GitHubプロジェクトを通じて募集されている。いずれもTypeScriptコントリビューションガイドラインおよびMicrosoftオープンソースコード規範に従うことが必要だ。

この記事に星をつける

おすすめ度
スタイル

BT