Ce este
Șablonul Iterator parcurge o colecție fără a dezvălui cum este stocată. Apelantul cere doar elementul următor — dacă datele stau într-un tablou, într-un arbore sau într-o bază de date rămâne privat.
TypeScript are acest șablon integrat. O clasă care definește metoda [Symbol.iterator]() poate fi parcursă cu for...of, iar cel mai simplu mod de a scrie acea metodă este un generator: o funcție marcată cu * care produce valori una câte una prin yield.
Exemplu: parcurgerea unei liste de redare
Lista de redare își păstrează privat tabloul de melodii. Oferă doar [Symbol.iterator](), scris ca generator — stocarea din spate s-ar putea schimba complet fără a strica vreun apelant.
Un generator și for...of
Bucla nu atinge niciodată tabloul din interiorul listei de redare; cere doar melodia următoare și afișează se redă: intro, se redă: strofă, se redă: refren. Înlocuiește tabloul cu o listă înlănțuită sau cu încărcare leneșă, iar această buclă tot va funcționa.
Ieșire: program TypeScript și rezultatul capturat
class Playlist {
private songs: string[]
constructor(songs: string[]) {
this.songs = songs
}
// Un generator oferă câte o melodie pe rând; tabloul rămâne privat.
*[Symbol.iterator](): Generator<string> {
for (const song of this.songs) {
yield song
}
}
}
const playlist = new Playlist(["intro", "strofă", "refren"])
for (const song of playlist) {
console.log("se redă:", song)
}
Când să îl folosești
Folosește-l când interiorul colecției trebuie să rămână privat, când parcurgerea nu este banală (arbori, pagini de la un API) sau când ai nevoie de mai multe parcurgeri independente în același timp.
Renunță la el pentru tablouri simple și obiecte Map din codul tău — ele sunt deja iterabile, așa că for...of funcționează direct pe ele.
Avantaje și dezavantaje
Avantaje: stocarea rămâne privată și se poate schimba; fiecare for...of primește propria parcurgere independentă; parcurgerea complicată se scrie o singură dată; un generator este leneș — calculează valoarea următoare doar când i se cere.
Dezavantaje: mai mult cod decât expunerea tabloului; un iterator activ peste o colecție care se schimbă este o sursă clasică de erori subtile.