ジェネリックパラメータのデフォルト指定、非同期イテレータのサポートなどを加えたTypeScript 2.3

TypeScript 2.3は言語構文が拡張され、ジェネリック型パラメータのデフォルト値宣言と非同期ジェネレータおよびイテレータのサポートが追加されている。新しいコンパイルオプションによる既存のJavaScriptコードとの統合の改善と、言語サーバプラグインの公式サポートの導入も目的とされている。

ジェネリックパラメータのデフォルトは、関数パラメータのデフォルトと同じく、TypeScriptジェネリック構文をより柔軟にするものだ。3つの異なる呼び出し方法をサポートするジェネリック関数を例としよう。

declare function create(): Container<HTMLDivElement, HTMLDivElement[]>;
declare function create<T extends HTMLElement>(element: T): Container<T, T[]>;
declare function create<T extends HTMLElement, U extends HTMLElement>(element: T, children: U[]): Container<T, U[]>;

これが次のように、より簡潔に表現できるようになる。

declare function create<T extends HTMLElement = HTMLDivElement, U = T[]>(element?: T, children?: U): Container<T, U>;

デフォルト/オプションパラメータの後には必須のパラメータを宣言できない、デフォルト値は型パラメータなどの制約を満たしていなければならないなど、関数パラメータのデフォルトのルールは、同じようにジェネリックパラメータのデフォルトにも適用される。

TypeScript 2.3では、--downlevelIterationコンパイルフラグを使用することで ES3およびES5をターゲットとしたジェネレータとイテレータのコンパイルが可能になった他、非同期イテレータとジェネレータもサポートされている。非同期イテレータも通常のイテレータと同じく、nextreturnthrowという3つのメソッドを提供する。唯一の違いは、実際の結果ではなくPromiseを返すことだ。

interface AsyncIterator<T> {
  next(value?: any): Promise<IteratorResult<T>>;
  return?(value?: any): Promise<IteratorResult<T>>;
  throw?(e?: any): Promise<IteratorResult<T>>;
}

イテレータの場合と同じく、非同期ジェネレータは、部分的な計算結果を獲得可能な非同期関数である。

async function* g() {
  yield 1;
  await sleep(100);
  yield* [2, 3];
  yield* (async function *() {
    await sleep(100);
    yield 4;
  })();
}

非同期イテレータと非同期ジェネレータに関連して、TypeScript 2.3では、非同期 のfor..ofステートメントに似たfor..await..ofも導入されている。

async function f() {
  for await (const x of g()) {
     console.log(x);
  }
}

非同期イテレータと非同期ジェネレータ、およびfor for..await..ofのサポートはオプトインであり、-- --libオプションにesnextを含める必要がある。

従来のJavaScriptコードでの作業を容易にすることを目的とした、新しいコンパイルオプションが追加された。具体的には、TypeScriptコンパイラに.jsファイルのコンパイルエラーも報告させる、新しい--checkJsフラグである。これにより、開発者がファイルを.tsに変換しなくても、できる限り多くのエラーをキャッチすることが可能になる。--checkJsの指定は、 // @ts-nocheckあるいは//@ts-checkコメントを使用して、ファイル単位でオーバーライドすることもできる。TypeScriptの型アノテーションは.jsファイルでは使用できないが、JDoc型アノテーションについては、TypeScriptへの段階的な移行を可能にするためにサポートされている。

その他のコンパイルオプションとしては、利用可能な最高レベルの型安全性を、簡単に選択可能にするために新設された--strictフラグがある。tsc --initで新たに生成されるすべてのプロジェクトに対しては、現在はデフォルトとして以下のものと同じ--strictが適用される。

  • --strictNullChecks
  • --noImplicitAny
  • --noImplicitThis
  • --alwaysStrict

最後に、TypeScript 2.3では、Angularなどのテンプレートシステムを使用した自動補完や、TSLintGraphQLのようなその他のコンテントを使用した高度な機能をエディタに提供する既存のTypeScriptサポートを強化するために、言語サーバプラグインAPIが新たに導入されている。