web-dev-qa-db-ja.com

ノード8の推奨TypeScript構成

コンパイル済みソースをノード8で使用する場合、TypeScriptの推奨構成は何ですか?

ほとんどのチュートリアルでは、次を使用しますtsconig.json

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs"
  }
}

しかし、今では、利用可能なすべての機能がサポートされているわけではないことがわかりました。たとえば、['foo'].includes('bar')はエラーをスローします:プロパティ 'includes'はタイプ 'string []'に存在しません。

この問題に対処する issue を見つけました。解決策は、lib es7を使用することです。デフォルトのライブラリを上書きできました:"lib": ["es7"]

しかし、これがノード8の最適な構成であるかどうかはわかりません。そのライブラリでサポートされていない機能は他にありますか?定義されている多くの機能がありますか?

私の質問は次のとおりです。ノード8を使用する場合、targetlib、およびmoduleの最適な構成は何ですか?

48
Xenya

Node.js 8.10.0現在、ES2017の100%がサポートされています。そのバージョン以降をターゲットにしていることがわかっている場合、最適な構成は次のようになります。

  • "module": "commonjs"

    Node.jsはESモジュールを追加する方法を進めていますが、今のところCommonJSに固執する必要があります。

  • "target": "es2017"

    これにより、TypeScriptに、ES2017の機能を使用してJavaScript 構文を出力してもかまいません。実際には、これは、例えばポリフィル(__awaiter)を埋め込む代わりに、async/awaitを出力します。

  • "lib": ["es2017"]

    これは、TypeScriptに、ES2017以前で導入された関数とプロパティを使用してもよいことを伝えます。実際には、これは、たとえばArray.prototype.includesおよびString.prototype.padStart

したがって、完全な構成は次のようになります。

{
  "compilerOptions": {
    "lib": ["es2017"],
    "module": "commonjs",
    "target": "es2017"
  }
}
82
Linus Unnebäck

あなたはすでにこれを見つけたと確信していますが、ここにはMicrosoftのスターターテンプレートがあります: https://github.com/Microsoft/TypeScript-Node-Starter

まだNode 8.xを使用している間、modulecommonjsに設定したままにしてください。targetにはes6を指定できます。

compilerOptions.libは、コンパイル時のチェックにコンパイラが使用する宣言のみを定義し、tscの出力には影響しません。つまり、必要なlibを使用でき、トランスコードされたコードが異なることを心配する必要はありません(これはcompilerOptions.targetによって完全に制御されます)。

あなたのケースでes7libとして使用することは問題なく、ES7以下の型宣言を提供します。

Array.includesはES7(ES2016)であるため、あなたが発見したようにES6の一部ではありません。 libを次のように定義できます。 lib: ["es6", "ES2016.Array.Include"]で問題を回避します。

2
Robula