TypeError: Iterator/AsyncIterator constructor can't be used directly
Der JavaScript-Ausnahmefehler "Iterator constructor can't be used directly" oder "AsyncIterator constructor can't be used directly" tritt auf, wenn Sie versuchen, die Konstruktoren Iterator()
oder AsyncIterator()
direkt zu verwenden, um Instanzen zu erstellen. Diese Konstruktoren sind abstrakte Klassen und sollten nur durch Vererbung verwendet werden.
Meldung
TypeError: Abstract class Iterator not directly constructable (V8-based) TypeError: Iterator constructor can't be used directly (Firefox) TypeError: Iterator cannot be constructed directly (Safari) TypeError: Abstract class AsyncIterator not directly constructable (V8-based) TypeError: AsyncIterator constructor can't be used directly (Firefox) TypeError: AsyncIterator cannot be constructed directly (Safari)
Fehlertyp
Was ist schiefgelaufen?
Die Konstruktoren Iterator
und AsyncIterator
sind abstrakte Klassen und sollten nicht direkt verwendet werden. Sie überprüfen den Wert von new.target
und werfen einen Fehler, wenn dieser identisch mit dem Konstruktor selbst ist. Der einzige Weg, diese Konstruktoren zu nutzen, besteht darin, von ihnen in einer Unterklasse zu erben und super()
im Konstruktor der Unterklasse aufzurufen. Die Unterklasse muss auch eine next()
-Methode definieren, um nützlich zu sein.
Beispiele
Ungültige Fälle
new Iterator();
Gültige Fälle
class MyIterator extends Iterator {
#step;
#end;
constructor(start, end) {
// Implicitly calls new Iterator(), but with a different `new.target`
super();
this.#step = start;
this.#end = end;
}
next() {
if (this.#step >= this.#end) {
return { done: true };
}
return { value: this.#step++, done: false };
}
}
new MyIterator();