Generatorfuncties in TypeScript
Dit artikel legt de generatorfuncties in TypeScript uit.
Je kunt alles leren, van de basis van hoe je generatorfuncties gebruikt tot geavanceerde voorbeelden gecombineerd met asynchrone verwerking, samen met codevoorbeelden.
YouTube Video
Generatorfuncties
Generatorfuncties in TypeScript bieden vergelijkbare functionaliteit als de generatorfuncties in JavaScript. Generatorfuncties worden gedefinieerd met behulp van function* (een functiedeclaratie met een asterisk) en zijn speciale functies die de uitvoering kunnen pauzeren en hervatten, in tegenstelling tot normale functies.
Wanneer een generatorfunctie wordt aangeroepen, wordt een iterator geretourneerd, die waarden één voor één genereert via deze iterator. Je kunt de uitvoering pauzeren met het sleutelwoord yield of waarden van buitenaf doorgeven.
Basis syntaxis van generatorfuncties
1function* myGenerator(): Generator<number, void, unknown> {
2 yield 1;
3 yield 2;
4 yield 3;
5}
6
7const gen = myGenerator();
8
9console.log(gen.next().value); // 1
10console.log(gen.next().value); // 2
11console.log(gen.next().value); // 3
12console.log(gen.next().done); // true (Iteration finished)
- Definieer een generatorfunctie met
function* myGenerator(). - Het sleutelwoord
yieldpauzeert de uitvoering van de functie terwijl het een waarde retourneert. - Elke keer dat de methode
next()wordt aangeroepen, wordt de uitvoering van de generatorfunctie hervat en gaat deze verder naar de volgendeyield.
next() retourneert een object met de volgende waarde en een done eigenschap. Wanneer done true is, geeft dit aan dat alle waarden zijn gegenereerd en dat de verwerking van de generator is voltooid.
Toepassingen van generatorfuncties
Het gebruik van generatorfuncties maakt een eenvoudige representatie van sequentiële verwerking mogelijk. In het volgende voorbeeld maken we een generatorfunctie die een reeks getallen genereert.
1function* sequenceGenerator(start: number = 0, step: number = 1) {
2 let current = start;
3 while (true) {
4 yield current;
5 current += step;
6 }
7}
8
9const seq = sequenceGenerator(1, 2);
10
11console.log(seq.next().value); // 1
12console.log(seq.next().value); // 3
13console.log(seq.next().value); // 5
- In dit voorbeeld genereert
sequenceGeneratoreen oneindig toenemende reeks getallen. Gebruikyieldom waarden bij elke stap te retourneren en genereer de volgende waarde bij volgende aanroepen.
Waarden doorgeven aan next
De methode next() kan een waarde ontvangen die naar de generatorfunctie kan worden verzonden.
1function* adder() {
2 const num1 = yield;
3 const num2 = yield;
4 yield num1 + num2;
5}
6
7const addGen = adder();
8addGen.next(); // Initialization
9addGen.next(5); // Set 5 to num1
10const result = addGen.next(10).value; // Set 10 to num2 and get result
11console.log(result); // 15
- In dit voorbeeld sturen
next(5)ennext(10)hun respectieve waarden naar de generatorfunctie enyield num1 + num2retourneert hun som.
return en throw
return(value)kan de generator beëindigen en de opgegeven waarde retourneren.throw(error)kan een exceptie in de generator werpen, wat handig is voor foutafhandeling binnen de generator.
1function* testGenerator() {
2 try {
3 yield 1;
4 yield 2;
5 } catch (e) {
6 console.error("Error caught:", e);
7 }
8}
9
10const gen = testGenerator();
11console.log(gen.next().value); // 1
12gen.throw(new Error("An error occurred!")); // Error caught: An error occurred!
- In dit voorbeeld wordt de
throwmethode gebruikt om een fout in de generator te genereren, en die fout wordt binnen de generator opgevangen.
Type Definitie in TypeScript
De typedefinitie van een generatorfunctie kan in het volgende formaat worden gespecificeerd.
1// Generator<YieldType, ReturnType, NextType>
2function* myGenerator(): Generator<number, void, unknown> {
3 yield 1;
4 yield 2;
5 yield 3;
6}- Je specificeert types in de vorm van
Generator<YieldType, ReturnType, NextType>.YieldTypeis het type van de waarde die dooryieldwordt geretourneerd.ReturnTypeis het type van de waarde die doorreturnwordt geretourneerd.NextTypeis het type van de waarde die aannext()wordt doorgegeven.
In het volgende voorbeeld worden specifieke types gespecificeerd om de generator veilig met types te gebruiken.
1function* numberGenerator(): Generator<number, void, number> {
2 const num1 = yield 1;
3 const num2 = yield num1 + 2;
4 yield num2 + 3;
5}
6
7const gen = numberGenerator();
8
9console.log(gen.next().value); // 1
10console.log(gen.next(10).value); // 12 (10 + 2)
11console.log(gen.next(20).value); // 23 (20 + 3)
Generatoren en Asynchrone Verwerking
Generatoren kunnen ook worden gebruikt voor asynchrone verwerking. Bijvoorbeeld, je kunt yield gebruiken om te wachten op de resultaten van asynchrone operaties terwijl je doorgaat met sequentiële verwerking. Echter, in TypeScript of JavaScript wordt async/await vaker gebruikt.
1function* asyncTask() {
2 const result1 = yield fetch("https://codesparklab.com/json/example1.json");
3 console.log(result1);
4
5 const result2 = yield fetch("https://codesparklab.com/json/example2.json");
6 console.log(result2);
7}Dus, hoewel je met generatoren asynchrone operaties sequentieel kunt verwerken, worden ze niet vaak gebruikt voor asynchrone verwerking omdat Promises en async/await handiger zijn.
Samenvatting
- Generatorfuncties zijn speciale functies gedefinieerd met
function*die waarden kunnen retourneren metyieldterwijl de uitvoering van de functie wordt gepauzeerd. - Gebruik
next()om de generator te hervatten en waarden te ontvangen. Daarnaast kun je waarden naar de generator sturen met behulp vannext(value). - Je kunt
return()enthrow()gebruiken om generatorfuncties te beëindigen of fouten af te handelen. - Wanneer je generatoren gebruikt in TypeScript, kun je typedefinities gebruiken om type-veilige code te schrijven.
Generatoren zijn krachtige tools die je in staat stellen iteraties flexibel te beheren.
Je kunt het bovenstaande artikel volgen met Visual Studio Code op ons YouTube-kanaal. Bekijk ook het YouTube-kanaal.