私はまだこれに対する良い答えを見つけることができませんでした。 「ターゲット」オプションは、結果が実行されるJavascriptのバージョンを定義します。 「lib」オプションはどこにも明確に説明されていません。ターゲット環境をよりきめ細かく説明する方法のようですが、.tsソースファイルに書き込むことができるものに影響を与えるのは奇妙に思えます。 TSをJSのスーパーセットと考えたのに、なぜPromise()
が使用可能かどうかに影響するのでしょうか?これは、ターゲットを定義するだけでなく、TypeScriptで使用できる関数にも影響を与えるようです。誰かがそれを明確にまたは直接答えに説明できますか(typescriptlang.orgや私が見た本にはありません。たとえば、「コンパイルに含めるライブラリファイルを指定してください」など、まったく説明がありません。
TypeScriptには組み込みのタイプはありません。すべてのタイプは、一連の基本定義(TypeScriptインストールディレクトリのlib
フォルダーにあります)から取得されます。デフォルトでは、target
はどのlibs
が含まれるかを定義します。たとえば、 docs 状態:
注:-libが指定されていない場合、ライブラリのデフォルトリストが挿入されます。注入されるデフォルトのライブラリは次のとおりです。
►
--target ES5: DOM,ES5,ScriptHost
の場合►
--target ES6: DOM,ES6,DOM.Iterable,ScriptHost
の場合
基本的な考え方は、ターゲットが言語機能(より具体的には、ダウンコンパイルする必要のある言語機能、例:for-of、または矢印関数)を扱うのに対し、lib
オプションはランタイム環境のどの機能を扱うかということです。持っています(つまり、組み込みオブジェクトがどのように見えるか、それらが何であるか)。
理想的には、特定のlibs
のデフォルトのtarget
を使用する必要があります。ただし、一部のランタイム機能をサポートしているが言語機能はサポートしていない環境がある場合や、より低いes
バージョンでランタイムをターゲットにして、一部のランタイム機能をポリフィルする場合があります。いくつかのことのために一般的に行われます(例:約束)。
TSneverは、コードにポリフィルを挿入しないことを忘れないでください。それは その目標ではありません です。上記の答えを補完する:
target
は、最終的なコードでサポートするES仕様をTSに指示します。これをES5
として構成すると、TSは構文機能をES5にダウンコンパイルするため、コード内の矢印関数(() => {}
)はすべて関数に変換されます。ただし、ブラウザが実行時にすべてのES5機能機能をサポートしていることも前提としています。たとえば、コードにArray.isArray
(ES5機能)が含まれていて、IE8でWebサイトを開こうとすると、ブラウザーがこれをサポートしていないため、壊れてしまいます。そのブラウザをサポートしたい場合は、それをポリフィルする必要があります。
lib
は、プロジェクトに含めるタイプ定義をTSに指示します。 "target": "es5"
がある場合、lib
のデフォルト値は["dom", "es5", "ScriptHost"]
になります。これは、ブラウザが実行時にサポートする機能機能を意味します。 lib
に物事を追加するのは、TSを満足させるためだけです。それでも、プロジェクトに自分でポリフィルをインポートする必要があります。つまり、最初にtarget
を構成し、プロジェクトで追加のポリフィルが必要な場合はOR youknowお使いのブラウザはこの小さな追加機能をサポートします。lib
はTSを満足させる方法です。
例:IE11をサポートする必要がありますが、Promisesも使用したいと考えています。 IE11はES5をサポートしていますが、PromisesはES6の機能です。 TypeScriptに、コードがES5 +自分で追加する追加のポリフィルをターゲットにすることを伝えることができます。
"target": "es5",
"lib": ["es5", "dom", "ScriptHost", "es2015.promise"]