2017-02-07 6 views
12

私はターゲットとlibオプションと、それらがソースコードでサポートされている機能とどのように対話するのか混乱しています。ドキュメントを少し改善する必要があると感じていますので、問題を提起する前にここで質問しています。ターゲットとlibコンパイラオプションの明確化が必要

ターゲットが、出力コードが(モジュールローダーを追加して)実行するのに必要なJSのバージョンを指定しているとは思っていませんでした。このため、TSがソースでサポートするすべての高度なJS機能(オブジェクトスプレッドなど)を常に使用することができ、コンパイラは指定したターゲットに適切なコードを生成します。私はそれが手にpolyfillsなどを持っていたと仮定し、コードはターゲットVM上で実行されます。

しかし、libオプションのドキュメントでは、デフォルトのlibsをターゲットに応じて指定しています。しかし、libsはどのソース・タイプが利用可能であるかに影響を及ぼし、使用できるコードに影響を与えます。したがって、使用できるソース機能はターゲットに依存します。それは私が期待した通りではありません。私はlibの私の理解は、彼らは実際には何を言っているわけではありませんが、彼らは別のAPIで入力されているということです。

ここでは、タイプに依存しない言語機能やその他の機能があります。しかし、それがこのような状況の理由の一部であるかどうかは明らかではありません。

誰かがこれを明確にしてもらえますか?

2番目の質問は、同じものとして通常文書化されている場合、ES6とES2015の両方のlibが存在する理由です。

おかげ

答えて

26

(これはコメントとしてスタートしたが、それはあまりにも長くなった。)

それはその背後にあるいくつかの歴史がありますので、部分的に少し混乱です。私は正式にこれに答えるために修飾されていないが、私は初期の開発以来、活字を追ってきたし、これが私の理解です:

  • --targetは、コンパイル中(例えばES5は、コンパイラを与える含めるためにどのようなライブラリのバージョンのコンパイラに指示しますエラーあなたがPromiseを使用しますが、ES6はすべて約Promise JSのバージョンは、コンパイラによってを放射されている知っている場合(例えば、ES5のクラス構文をダウンコンパイルしますが、ES6はそれを残します)。
  • --libは、放出されたJSターゲットを変更せずにをコンパイルする際に使用するライブラリバージョンをよりよく制御できるように、後で追加されました。たとえば、PromiseなどのES6ライブラリ機能用のポリフィルを含めることができますが、classシンタックスをコンパイルしてES5ブラウザを対象にしたいという共通の問題がありました。 --lib前にあなたの周りにいたいずれかのバベルを使用して再びダウンコンパイルPromiseについてコンパイルエラーを回避するために、ES6を対象としなければならなかった、またはコンパイラがあなたに与えないように、あなたがES5をターゲットとPromiseための独自の型定義を提供することができますエラー。 --libでは、単に--target ES5--lib ES6と言うことができます。コンパイラはPromiseについては不平は言いませんが、まだES5にダウンコンパイルします。
  • どちらのオプションでも、明らかにわかったように、TSはライブラリのポリフィル(Promiseなど)を放出しません。正しいランタイムライブラリを提供するのはあなたの責任です。__extends__awaiterclassまたはasyncという違いは、実行時にポリ充てることができるAPIだけではなく、構文の意味を持つ言語機能です)のようないくつかの下位レベルの言語互換ヘルパーを発行します。 --libオプションは、実行時に知っていることに基づいて適切なレベルのコンパイルチェックを取得する方法です。
  • ES6ES2015の両方の理由は、ECMAScriptが名前を変更し、TSが古い名前を下位互換性のための有効なオプションとして残したからです。 :)

あなたはこれらのTSの問題でカバー本をたくさん見つけることができます:優れた答えを

+0

感謝を。だから、混乱の根源は、 '' '-target''が2つのことを加え、いくつかの言語機能がダウンコンパイルされているのに対し、他のものはソースではなくlibを必要とすることです。 –

+0

それもなぜあなたはTSとBabelを使うのですか?:)多くの現在のブラウザをターゲットにする良い方法は、BabelがES5に移行するTSのターゲットES6です。 –

関連する問題