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 lib
compiler 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.
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). –
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
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. –