2017-03-02 11 views
2

私は、Typescriptコンパイラが、指定したターゲットのECMAScriptバージョン(ES5またはES3)と互換性を持たせるために、いつ翻訳を行うのかを理解しようとしています。ES5/ES3をターゲットとした場合、Typescriptはどのように表示されますか?

例えば、TSCはfor(var int of intArray)を細かく表示しますが、Number.isInteger()(これはw3schoolsによると、ES6の機能です)では表示されません。

Number.isInteger()は、IE < 11.0ではサポートされていません。これは問題です。 Visual Studio(およびVSコード)では、互換性の警告は表示されず、表示されません。

私は何が得られると期待できますか?何ができませんか?私は当初、すべてが蒸散されると予想していたので、このようなことを把握する必要はありませんでしたが、それはそうではないようです。

+0

私はTSがこれを 'Promise 'のように扱っていると思います。つまり、あなたが入力してからすでにpolyfillがあると仮定します。 'Number.isInteger'は多面的にポリ充てんされていますが、ポリフィルはTSがしたいことではありません。たとえば、[polyfillsについてのこのコメント](https://github.com/Microsoft/TypeScript/issues/4031#issuecomment-125712496)を参照してください。 –

+1

これが当てはまる場合、IDEが私の目標とするECMAScriptバージョンと私のコードとの非互換性を警告するならばいいでしょう。私はNumber.isInteger()を使用し始めました。なぜなら、Visual Studioはそれを私に提供していて、多くの(比較的近代的な)ブラウザがそれをサポートしていないことを後に発見したからです。他の "地雷"が待っているかどうかは分かりません! – JoshMB

+0

おそらく、あなたがブラウザを知っているまで、欠落している可能性がある多くのものをポリフィルする[es6-shim](https://github.com/paulmillr/es6-shim)のようなものを使用することをお勧めしますターゲティングはすべての機能をサポートします。 –

答えて

3

コンパイラは、使用するように指示したlibに基づいて機能をサポートしています。
targetlibcompiler optionsを使用することにより、コンパイラが使用するはlibかを制御するには2つの方法があります。それは上記のリンクに書かれているとおり

:--libは、デフォルトのライブラリを指定されていない場合

が注入されます。注入されたデフォルト ライブラリです:
►--target ES5について:DOM、ES5、ScriptHost
► --target ES6の場合:DOM、ES6、DOM.Iterable、ScriptHost

異なるのすべてlibsはpart of the projectです。

あなたは、あなたが(あなたが述べたように)それはes6機能だとしてNumber.isInteger()を使用することはできませんes3またはes5をターゲットにしている場合。あなたはそのためのpolyfilをお持ちの場合
は、あなたはまだes6 LIBとes5をターゲットにすることができます:

--target es5 --lib DOM,ES6,ScriptHost 

それとも、ただlib.es6.d.tsの定義をコピーすることができます。

interface NumberConstructor { 
    isInteger(number: number): boolean; 
} 

理由letconstfor/ofのようなものをターゲットに関係なく使用できることは、コンパイラが同等のコードを生成する方法を知っていることです選択されたターゲットに対して機能がサポートされていない場合でも、例えば

:ターゲットが指定されていない場合は

var arr = [1, 2, 3]; 
for (var _i = 0, arr_1 = arr; _i < arr_1.length; _i++) { 
    var num = arr_1[_i]; 
} 

const arr = [1, 2, 3]; 
for (let num of arr) {} 

がにコンパイルされます。
ご覧のとおり、とletvarになり、for/inは通常のforに変わります。

Number.isInteger()は異なるものですが、それはPromiseや 'シンボル'のような特定のターゲットには存在しない機能です。
コンパイラはpolyfillを追加しません。追加するのはあなた次第です。それがコンパイラにあることをコンパイラに伝えます。

+0

お返事ありがとうございます。私が探しているのは、どのカテゴリの機能性が譲渡されるかどうかを知る方法です。私はTypescriptプロジェクトで作業している人にとっては意味があると確信していますが、現時点では私はややランダムです。結果として、それは推測とチェックのゲームになります。なぜfor(int intのvar int)が 'Number.isInteger()'と根本的に異なるのですか? – JoshMB

+0

ああ。そのための良い説明があります。私の改訂版の回答を確認してください。 –

関連する問題