Typescript: für..of mit Iteratoren

Erstellt am 14. Mai 2015  ·  9Kommentare  ·  Quelle: microsoft/TypeScript

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.

Question

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.

Alle 9 Kommentare

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:

  • Eines der TypeScript-Axiome besteht darin, keine typgerichtete Ausgabe durchzuführen. Das heißt, dass der ausgegebene Code nicht davon abhängt, was das Typsystem über Ihren Code denkt, sondern vielmehr von einer syntaktischen Transformation Ihrer Eingabequelle.
  • Wenn wir die vollständige Iterator-Emulation durchführen, müssen wir uns auf eine Pollyfill für Symbol verlassen, eine weitere Qualität, die wir gerne beibehalten
  • Die generierte vollständige Iterationslogik ist nicht billig. Sie müssen next () aufrufen und fertig prüfen, wenn die Rückgabe fehlschlägt, wenn Sie den Wert nicht verwenden. Dies ist ein zusätzlicher Versand, zwei Eigenschaftssuchen und eine Objektzuweisung bei jeder Iteration einer Schleife. Wir haben versucht, den ausgegebenen Code einfach und für die Quelle relevant zu halten, insbesondere in Bezug auf die Leistungsmerkmale
  • Um all dies für benutzerdefinierte iterierbare Objekte zu tun, müssen wir dies immer noch für Arrays tun, da Arrays diese Unterstützung in ES5 / ES3 nicht haben und wir keine typgerichtete Ausgabe durchführen möchten. Wir müssen ein Array konvertieren zu einer iterablen, die drastisch langsamer als Ihre normale for-Schleife ist. und das Hauptproblem ist, dass aus der Betrachtung einer Schleife in einem Array nicht klar ist, dass diese Kosten anfallen würden.

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen