web-dev-qa-db-ja.com

TypeScriptの「lib」オプションは実際に何をしますか?

私はまだこれに対する良い答えを見つけることができませんでした。 「ターゲット」オプションは、結果が実行されるJavascriptのバージョンを定義します。 「lib」オプションはどこにも明確に説明されていません。ターゲット環境をよりきめ細かく説明する方法のようですが、.tsソースファイルに書き込むことができるものに影響を与えるのは奇妙に思えます。 TSをJSのスーパーセットと考えたのに、なぜPromise()が使用可能かどうかに影響するのでしょうか?これは、ターゲットを定義するだけでなく、TypeScriptで使用できる関数にも影響を与えるようです。誰かがそれを明確にまたは直接答えに説明できますか(typescriptlang.orgや私が見た本にはありません。たとえば、「コンパイルに含めるライブラリファイルを指定してください」など、まったく説明がありません。

17

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"]
5
cleison