Creating an Iterable Class
Classes que define uma propriedade Symbol.iterator podendo implementar a interface Iterable<T>, que permite iteração sem necessariamente chamar o metodo ou ler a propriedade:
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> implements Iterable<T> {
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;
}
[Symbol.iterator](): Iterator<T> {
return this.items.values();
}
}
let productCollection: Collection<Product> = new Collection(products);
console.log(`There are ${productCollection.count} products`);
[...productCollection].forEach(p => console.log(`Product: ${p.name}, ${p.price}`));
A nova propriedade implementa a interface Iterable<T>
[Symbol.iterator](): Iterator<T> {
return this.items.values();
}
Indicando que isso define ua propriedade Symbol.iterator que retorna um objeto Iterator<T> para ser usado para iterações:
[...productCollection].forEach(p => console.log(`Product: ${p.name}, ${p.price}`));
09 December 2025