Es wäre schön, wenn die neue Sintax for (let value of values)
mit Iteratoren funktioniert; dh:
for (let value of myMap.values()) {
doSomething(value);
}
Verwandt mit # 2695.
Dies ist bereits zulässig, wenn Ihr Ziel ES6 ist:
interface MyMap<T> {
values(): Iterable<T>;
}
var myMap: MyMap<string>;
for (let value of myMap.values()) {
var s: string = value;
}
Der Grund, warum dies in ES5 / ES3 nicht zulässig ist, sind:
Aufgrund dieser Faktoren sind in ES3 / ES5 nur Arrays für for-Schleifen zulässig (als die heute am häufigsten in der JS-Sprache verfügbaren iterierbaren Objekte). Für das Targeting von ES6 (dh mit Laufzeit-Engine-Unterstützung für iterable und iterable Arrays) sind benutzerdefinierte Iterables zusätzlich zu Array, String, Map und Set usw. zulässig.
Verstanden...
@mhegazy Vielen Dank für Ihre ausführliche Antwort !!!
Ich finde das wirklich enttäuschend. Ich kann for-of mit jedem iterierbaren und zielgerichteten ES5 mit Traceur und Babel heute verwenden. Ich möchte vorschlagen, dass unser Team von Traceur zu TypeScript wechselt, aber diese Einschränkung in TypeScript verhindert dies. Wenn TypeScript angibt, dass es eine Obermenge von ES6 sein soll, muss dies meiner Meinung nach die Möglichkeit beinhalten, ES5-Browser für alle von ES6 unterstützten Funktionen als Ziel festzulegen.
Ich denke, ich könnte TypeScript verwenden, um auf ES6 abzuzielen und diese Ausgabe dann über Traceur oder Babel auszuführen. Das möchte ich aber wirklich nicht müssen.
Als Update für dieses Problem wird das Iteratorprotokoll jetzt für Ziel-ES3 / ES5 mit --downlevelIteration
. Siehe # 12346 für weitere Informationen.
Es sieht so aus, als ob dies für TS 2.3 behoben sein sollte, aber ich verwende TS 2.3.3 und
for (let [ i, observationPoint ] of observationPointsList.entries())
observationPoints[ observationPoint.spot || (i + 1) ] = observationPoint;
wobei observationPointsList
ein ObservationPointModel[]
, ergibt sich:
[11:30:56] typescript: src/models/observation-set.ts, line: 44
Type 'IterableIterator<[number, ObservationPointModel]>' is not an array type or a string type.
Vermisse ich etwas
Ah, in der Tat. Ich kann in dieser Dokumentation oder # 12346 nicht sehen - warum ist dies hinter einer Option im Gegensatz zum Standardverhalten verborgen? Wird dies immer optional bleiben?
@lhunath ist es in den offiziellen Release-Informationen für 2.3 . Es ist optional, da es einen erheblichen Einfluss auf die Größe des generierten Codes und möglicherweise auf die Leistung für alle Verwendungen von Iterables (einschließlich Arrays) hat. Ich finde, dass der Kompromiss die erhöhte Ausdruckskraft wert ist, aber die Verlangsamung und Komplexität des vorhandenen Codes scheint eine vernünftige Rechtfertigung dafür zu sein, dass es eine Flagge gibt.
Hilfreichster Kommentar
Ich finde das wirklich enttäuschend. Ich kann for-of mit jedem iterierbaren und zielgerichteten ES5 mit Traceur und Babel heute verwenden. Ich möchte vorschlagen, dass unser Team von Traceur zu TypeScript wechselt, aber diese Einschränkung in TypeScript verhindert dies. Wenn TypeScript angibt, dass es eine Obermenge von ES6 sein soll, muss dies meiner Meinung nach die Möglichkeit beinhalten, ES5-Browser für alle von ES6 unterstützten Funktionen als Ziel festzulegen.