コンパイル済みソースをノード8で使用する場合、TypeScriptの推奨構成は何ですか?
ほとんどのチュートリアルでは、次を使用しますtsconig.json:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs"
}
}
しかし、今では、利用可能なすべての機能がサポートされているわけではないことがわかりました。たとえば、['foo'].includes('bar')
はエラーをスローします:プロパティ 'includes'はタイプ 'string []'に存在しません。
この問題に対処する issue を見つけました。解決策は、lib es7
を使用することです。デフォルトのライブラリを上書きできました:"lib": ["es7"]
しかし、これがノード8の最適な構成であるかどうかはわかりません。そのライブラリでサポートされていない機能は他にありますか?定義されている多くの機能がありますか?
私の質問は次のとおりです。ノード8を使用する場合、target
、lib
、およびmodule
の最適な構成は何ですか?
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"
}
}
あなたはすでにこれを見つけたと確信していますが、ここにはMicrosoftのスターターテンプレートがあります: https://github.com/Microsoft/TypeScript-Node-Starter
まだNode 8.xを使用している間、module
をcommonjs
に設定したままにしてください。target
にはes6
を指定できます。
compilerOptions.lib
は、コンパイル時のチェックにコンパイラが使用する宣言のみを定義し、tsc
の出力には影響しません。つまり、必要なlib
を使用でき、トランスコードされたコードが異なることを心配する必要はありません(これはcompilerOptions.target
によって完全に制御されます)。
あなたのケースでes7
をlib
として使用することは問題なく、ES7以下の型宣言を提供します。
Array.includes
はES7(ES2016)であるため、あなたが発見したようにES6
の一部ではありません。 lib
を次のように定義できます。 lib: ["es6", "ES2016.Array.Include"]
で問題を回避します。