2017-03-02 2 views
2

Ich versuche zu verstehen, wenn der Typescript-Compiler Code transpilieren wird, damit er mit meiner angegebenen ECMAScript-Zielversion (ES5 oder ES3) kompatibel ist.Was wird Typescript beim Targeting von ES5/ES3 transponieren?

Zum Beispiel wird TSC for(var int of intArray) in Ordnung übertragen, aber es Number.isInteger() (das ist eine ES6-Funktion, nach w3schools) nicht transpile.

Number.isInteger() wird nicht in IE < 11.0 unterstützt, das ist also ein Problem. Visual Studio (und VS-Code) bieten keine Warnungen vor Inkompatibilität und werden nicht transpiliert.

Was kann ich erwarten, transpiliert zu werden, und was nicht? Ich hatte zunächst erwartet, dass alles transpiliert werden würde, so dass ich solche Dinge nicht im Auge behalten müsste, aber das scheint nicht der Fall zu sein.

+0

Ich glaube, TS ist so viel wie der 'Promise ' Typ. Das heißt, es wird angenommen, dass Sie bereits ein Polyfill haben, seit Sie es eingegeben haben. Während "Number.isInteger" trivial poly-gefüllt ist, sind Polyfills nichts, was TS tun möchte. Siehe zum Beispiel [diesen Kommentar zu Polyfills] (https://github.com/Microsoft/TypeScript/issues/4031#issuecomment-125712496). –

+1

Wenn das der Fall ist, wäre es schön, wenn die IDE mich auf die Inkompatibilität meines Codes mit meiner gezielten ECMAScript-Version aufmerksam machen würde. Ich begann Number.isInteger() zu verwenden, weil Visual Studio es mir anbot und erst später entdeckte, dass viele (relativ moderne) Browser es nicht unterstützen. Nicht sicher, was andere "Landminen" erwarten! – JoshMB

+0

Wahrscheinlich ist es eine gute Idee, etwas wie [es6-shim] (https://github.com/paulmillr/es6-shim) zu verwenden, das viele Dinge filtert, die vielleicht fehlen, zumindest bis du die Browser kennst, die du bist Targeting unterstützt alle Funktionen. –

Antwort

3

Der Compiler unterstützt Funktionen, die auf der von Ihnen angegebenen lib basieren.
Es gibt zwei Möglichkeiten, um die Kontrolle zu lib der Compiler verwenden, indem Sie die target und libcompiler options verwenden.

Wie es in dem obigen Link geschrieben:

Wenn --lib keine Standardbibliothek angegeben wird, injiziert. Die Standard- Bibliothek injiziert ist:
► Für --target ES5: DOM, ES5, ScriptHost
► Für --target ES6: DOM, ES6, DOM.Iterable, ScriptHost

alle unterschiedlichen libs sind part of the project.

Wenn Sie es3 oder es5 dann zielen Sie nicht Number.isInteger() wie es ist (wie Sie erwähnt) ein es6 Funktion verwenden können.
Wenn Sie eine polyfil dafür dann können Sie immer noch es5 mit dem es6 lib Ziel:

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

Oder Sie können einfach die Definition für die lib.es6.d.ts kopieren:

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

Der Grund dass Sie Dinge wie let, const, for/of verwenden können, unabhängig davon, ob der Compiler weiß, wie man äquivalenten Kabeljau herstellt e auch dann, wenn die Funktion für das ausgewählte Ziel nicht unterstützt wird.

Zum Beispiel:

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

Ist zusammengestellt:

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

Wenn kein Ziel angegeben wird.
Wie Sie sehen können, werden die const und let in var s umgewandelt, und die for/in wird in eine reguläre for umgewandelt.

Number.isInteger() ist etwas anderes, es ist eine Funktionalität, die nicht in bestimmten Zielen existiert, wie Promise und "Symbol".
Der Compiler fügt das Polyfill nicht hinzu, es liegt an Ihnen, es hinzuzufügen und dann dem Compiler mitzuteilen, dass es da ist.

+0

Danke für Ihre Antwort. Nach was ich suche, ist eine Weise, zu wissen, welche Kategorien der Funktionalität nicht und nicht transpiliert werden. Ich bin mir sicher, dass es für diejenigen, die am Typescript-Projekt arbeiten, sinnvoll ist, aber im Moment erscheint es mir etwas zufällig. Infolgedessen wird es ein Spiel des Ratens und der Kontrolle. Warum unterscheidet sich 'for (var int von intArray) grundlegend von' Number.isInteger() '? – JoshMB

+0

Oh. Dafür gibt es eine gute Erklärung. Überprüfen Sie meine überarbeitete Antwort. –

Verwandte Themen