TypeScriptコンパイラがコードをトランスパイルして、指定したターゲットECMAScriptバージョン(ES5またはES3)と互換性を持たせるタイミングを理解しようとしています。
たとえば、TSCはfor(var int of intArray)
を正常にトランスパイルしますが、Number.isInteger()
( w3schools によるとES6の機能)はトランスパイルしません。
Number.isInteger()
はIE <11.0でサポートされていないため、これは問題です。VisualStudio(およびVS Code)は非互換性の警告を提供せず、 'トランスパイルされます。
何がトランスパイルされると期待できますか、そして何が期待できませんか?私は当初、すべてがトランスパイルされることを期待していたので、このようなことを追跡する必要はありませんでしたが、そうではないようです。
コンパイラーは、使用するように指示したlibに基づく機能をサポートします。target
とlib
コンパイラオプション 。
上記のリンクに書かれているように:
--libが指定されていない場合、デフォルトのライブラリが挿入されます。注入されるデフォルトのライブラリは次のとおりです。
►--targetES5の場合:DOM、ES5、ScriptHost
►--targetES6の場合:DOM、ES6、DOM.Iterable、ScriptHost
さまざまなライブラリはすべて プロジェクトの一部 です。
_es3
_または_es5
_をターゲットにしている場合、(あなたが述べたように)_es6
_機能であるため、Number.isInteger()
を使用することはできません。
そのためのポリフィルがある場合でも、_es5
_ libを使用して_es6
_をターゲットにすることができます。
_--target es5 --lib DOM,ES6,ScriptHost
_
または、 lib.es6.d.ts の定義をコピーすることもできます。
_interface NumberConstructor {
isInteger(number: number): boolean;
}
_
ターゲットに関係なくlet
、const
、_for/of
_のようなものを使用できる理由は、機能がサポートされていない場合でも、コンパイラが同等のコードを生成する方法を知っているためです。選択したターゲット。
例えば:
_const arr = [1, 2, 3];
for (let num of arr) {}
_
コンパイルされます:
_var arr = [1, 2, 3];
for (var _i = 0, arr_1 = arr; _i < arr_1.length; _i++) {
var num = arr_1[_i];
}
_
ターゲットが指定されていない場合。
ご覧のとおり、const
とlet
はvar
sに変換され、_for/in
_は通常のfor
。
Number.isInteger()
は別のものであり、Promise
や 'Symbol`などの特定のターゲットには存在しない機能です。
コンパイラはポリフィルを追加しません。ポリフィルを追加して、そこにあることをコンパイラに通知するのはあなた次第です。
TypeScript transpilesですが、そうではありませんpolyfill。したがって、それを考える1つの方法は、target
で有効な構文ではないものはすべてtranspiledで有効な構文になるということです。たとえば、ターゲットを_ES5
_に設定してclass
キーワードを使用すると、次のようにトランスパイルされます。
_class Greeter {
}
_
これに:
_var Greeter = /** @class */ (function () {
function Greeter() {
}
return Greeter;
}());
_
(これでもっと遊ぶことができます ここ 。)
一方、不足している機能は追加されません。これは、自分でpolyfillする必要があります。 Number.isInteger()
は有効な_ES5
_構文であり、_ES5
_に存在する機能ではありません。 _babel-polyfill
_ (内部で _core-js
_ を使用)をインポートするか、 polyfill.io)のようなサービスを使用して、これを自分でポリフィルできます。 。
注:lib
オプションをポリフィルと混同しないでください。これしませんポリフィル機能。これらのESバージョンの機能が存在するかのように動作するようにTypeScriptに指示するだけなので、適切にタイプチェックします。サポートしているブラウザでは、ポリフィルピースを自分で処理する必要があります。適切なlib
sを指定しないと、TypeScriptはNumber.isInteger()
が何を表しているのかわからないと文句を言います。
TypeScriptトランスパイルの機能の包括的なリストはわかりませんが、TypeScript + _core-js
_ polyfills here の表を見ることができます。ポリフィルとトランスパイルの詳細 ここ 。