Como explicado no JavaScript - Collections, iterators permite uma sequencia de valores para ser enumerados e suporte para iteradores é uma feature comum para classes que operam com outros tipos, como collections. TS prove as interfaces listadas na tabela abaixo, descrevendo iterators e os seus resultados:
Nome
Descrição
Iterator
Interface que descreve um iterador cujo método next retorna objetos IteratorResult<T>.
IteratorResult
Interface que descreve o resultado produzido por um iterador, contendo as propriedades done e value.
Iterable
Interface que define um objeto com a propriedade Symbol.iterator e que suporta iteração direta (ex.: em for...of).
IterableIterator
Interface que combina Iterator<T> e Iterable<T>, descrevendo um objeto que possui Symbol.iterator, além de definir o método next e retornar resultados.
O uso das interfaces Iterator e IteratorResult para prover acesso para o conteúdo de Map<string, T> usado para guardar objetos pela classe Collection<T>:
import {City, Person, Product, Employee} from "./dataTypes";
let products = [new Product("Running Shoes", 100), new Product("Hat", 25)];
type shapeType = { name: string };
class Collection<T extends shapeType> {
private items: Map<string, T>;
constructor(initialItems: T[] = []) {
this.items = new Map<string, T>();
this.add(...initialItems);
}
add(...newItems: T[]): void {
newItems.forEach(newItem => this.items.set(newItem.name, newItem));
}
get(name: string): T {
return this.items.get(name);
}
get count(): number {
return this.items.size;
}
values(): Iterator<T> {
return this.items.values();
}
}
let productCollection: Collection<Product> = new Collection(products);
console.log(`There are ${productCollection.count} products`);
let iterator: Iterator<Product> = productCollection.values();
let result: IteratorResult<Product> = iterator.next();
while (!result.done) {
console.log(`Product: ${result.value.name}, ${result.value.price}`);
result = iterator.next();
}
O método values definido pela classe Collection retorna um Iterator.
Quando esse método é invocado em um objeto Collection<Product>, o iterador retornado produzirá objetos IteratorResult<Product> através de seu método next.
let iterator: Iterator<Product> = productCollection.values();
let result: IteratorResult<Product> = iterator.next();
A propriedade result de cada objeto IteratorResult<Product> retornará um Product, permitindo que os objetos gerenciados pela coleção sejam iterados.