Sería bueno si la nueva sintaxis for (let value of values)
funciona con iteradores; es decir:
for (let value of myMap.values()) {
doSomething(value);
}
Relacionado con # 2695.
Esto ya está permitido si su objetivo es ES6:
interface MyMap<T> {
values(): Iterable<T>;
}
var myMap: MyMap<string>;
for (let value of myMap.values()) {
var s: string = value;
}
Las razones por las que esto no está permitido en ES5 / ES3 son:
Como resultado de estos factores, en ES3 / ES5 solo se permiten matrices en for..of bucles (como los objetos iterables más comunes disponibles en el lenguaje JS en la actualidad); en cuanto a la orientación a ES6 (es decir, con soporte de motor en tiempo de ejecución para iterables y arreglos iterables) se permiten iterables personalizados además de Array, string, map and set, .. etc.
Entendido...
@mhegazy ¡¡¡ Muchas gracias por su respuesta detallada !!!
Encuentro esto realmente decepcionante. Puedo usar for-of con cualquier ES5 iterable y objetivo con Traceur y Babel hoy. Estoy interesado en proponer que nuestro equipo cambie de Traceur a TypeScript, pero esta limitación en TypeScript evitará que eso suceda. Cuando TypeScript dice que pretende ser un superconjunto de ES6, creo que debe incluir la capacidad de apuntar a los navegadores ES5 para todas las funciones de ES6 que admite.
Supongo que podría usar TypeScript para apuntar a ES6 y luego ejecutar esa salida a través de Traceur o Babel. Aunque realmente no quiero tener que hacer eso.
Como actualización para este problema, el protocolo iterador ahora es compatible con el destino ES3 / ES5 usando --downlevelIteration
. Consulte el n.º 12346 para obtener más información.
Parece que se supone que esto está arreglado para TS 2.3, pero estoy ejecutando TS 2.3.3 y
for (let [ i, observationPoint ] of observationPointsList.entries())
observationPoints[ observationPoint.spot || (i + 1) ] = observationPoint;
donde observationPointsList
es un ObservationPointModel[]
, produce:
[11:30:56] typescript: src/models/observation-set.ts, line: 44
Type 'IterableIterator<[number, ObservationPointModel]>' is not an array type or a string type.
¿Me estoy perdiendo de algo?
Ah, en verdad. No puedo ver en esta documentación o en el n. ° 12346: ¿por qué está oculto detrás de una opción en lugar del comportamiento estándar? ¿Será esto siempre opcional?
@lhunath está en la información de lanzamiento oficial de 2.3 . Es opcional porque tiene un impacto muy significativo en el tamaño del código generado, y potencialmente en el rendimiento, para todos los usos de iterables (incluidas las matrices). Creo que la compensación vale la pena por la mayor expresividad, pero hacer que el código existente sea más lento y más complejo parece una justificación razonable para que haya una bandera.
Comentario más útil
Encuentro esto realmente decepcionante. Puedo usar for-of con cualquier ES5 iterable y objetivo con Traceur y Babel hoy. Estoy interesado en proponer que nuestro equipo cambie de Traceur a TypeScript, pero esta limitación en TypeScript evitará que eso suceda. Cuando TypeScript dice que pretende ser un superconjunto de ES6, creo que debe incluir la capacidad de apuntar a los navegadores ES5 para todas las funciones de ES6 que admite.