Seria bom se a nova sintaxe for (let value of values)
funcionasse com iteradores; ie:
for (let value of myMap.values()) {
doSomething(value);
}
Relacionado com # 2695.
Isso já é permitido se seu destino for ES6:
interface MyMap<T> {
values(): Iterable<T>;
}
var myMap: MyMap<string>;
for (let value of myMap.values()) {
var s: string = value;
}
A razão pela qual isso não é permitido em ES5 / ES3 são:
Como resultado desses fatores, no ES3 / ES5 apenas os arrays são permitidos em loops for..of (como os objetos iteráveis mais comuns disponíveis na linguagem JS atualmente); quanto à segmentação ES6 (ou seja, com suporte a mecanismo de tempo de execução para iteráveis e arrays iteráveis), iteráveis personalizados são permitidos além de Array, string, map e set, .. etc.
Entendido...
@mhegazy Muito obrigado pela sua resposta detalhada !!!
Acho isso muito decepcionante. Posso usar for-of com qualquer ES5 iterável e de destino com Traceur e Babel hoje. Estou interessado em propor que nossa equipe mude de Traceur para TypeScript, mas esta limitação no TypeScript impedirá que isso aconteça. Quando o TypeScript diz que pretende ser um superconjunto do ES6, acho que precisa incluir a capacidade de direcionar os navegadores ES5 para todos os recursos ES6 que ele suporta.
Acho que poderia usar o TypeScript para direcionar o ES6 e, em seguida, executar essa saída por meio do Traceur ou Babel. Eu realmente não quero ter que fazer isso.
Como uma atualização para este problema, o protocolo do iterador agora é compatível com o destino ES3 / ES5 usando --downlevelIteration
. Veja # 12346 para mais informações.
Parece que isso deve ser corrigido para TS 2.3, mas estou executando o TS 2.3.3 e
for (let [ i, observationPoint ] of observationPointsList.entries())
observationPoints[ observationPoint.spot || (i + 1) ] = observationPoint;
onde observationPointsList
é um ObservationPointModel[]
, produz:
[11:30:56] typescript: src/models/observation-set.ts, line: 44
Type 'IterableIterator<[number, ObservationPointModel]>' is not an array type or a string type.
Estou esquecendo de algo?
Ah, é verdade. Não consigo ver nesta documentação ou no # 12346 - por que isso está oculto por trás de uma opção em oposição ao comportamento padrão? Isso sempre será opcional?
@lhunath está nas informações de lançamento oficial para 2.3 . É opcional porque tem um impacto muito significativo no tamanho do código gerado e, potencialmente, no desempenho, para todos os usos de iteráveis (incluindo arrays). Acho que a compensação compensa o aumento da expressividade, mas tornar o código existente mais lento e complexo parece uma justificativa razoável para a existência de um sinalizador.
Comentários muito úteis
Acho isso muito decepcionante. Posso usar for-of com qualquer ES5 iterável e de destino com Traceur e Babel hoje. Estou interessado em propor que nossa equipe mude de Traceur para TypeScript, mas esta limitação no TypeScript impedirá que isso aconteça. Quando o TypeScript diz que pretende ser um superconjunto do ES6, acho que precisa incluir a capacidade de direcionar os navegadores ES5 para todos os recursos ES6 que ele suporta.