node.js - Hur man anropar föräldraklassens Symbol.iterator från barnklassens Symbol.iterator
Jag har följande två klasser i TypeScript.
class BaseIter {
constructor(public a: number, public b: number, public c: number, public d: number){}
*[Symbol.iterator](): Iterator<number> {
yield this.a
yield this.b
yield this.c
yield this.d
}
}
class MyIter extends BaseIter {
get total() {
return this.a + this.b + this.c + this.d
}
*[Symbol.iterator](): Iterator<number> {
for(let x of this){
yield x
}
yield this.total
}
}
const myIter = new MyIter(1, 2, 3, 4);
for (let n of myIter){
console.log(n);
}
Klassen BaseIter tar emot fyra argument och returnerar dessa fyra argument när den itereras. Jag har en subklass som utökar BaseIter och som ska använda förälderns itereringsfunktion men även returnera ett extra värde (totalen). Den nuvarande koden fungerar inte - den orsakar en oändlig rekursion (att iterera över this anropar samma funktion istället för basklassen funktion). Jag har provat olika metoder med super utan framgång.
Jag förväntar mig att det ska producera
1
2
3
4
10
Några idéer?
Svar #1
Generatorfunktioner har en returtyp av IterableIterator<T>, inte Iterator<T>. Detta förhindrade TypeScript från att kunna använda metoden från superklassen som en iterable. Generellt sett bör du låta TypeScript härleda returvärdet för dina funktioner om det inte varnar dig för att det inte kan göra det.
class BaseIter {
constructor(public a: number, public b: number, public c: number, public d: number) {}
* [Symbol.iterator] () {
yield this.a;
yield this.b;
yield this.c;
yield this.d;
}
}
class MyIter extends BaseIter {
get total () {
return this.a + this.b + this.c + this.d;
}
* [Symbol.iterator] () {
yield * super[Symbol.iterator]();
yield this.total;
}
}
const myIter = new MyIter(1, 2, 3, 4);
for (const n of myIter) {
console.log(n);
}
