TypeError: Iterator/AsyncIterator-Konstruktor kann nicht direkt verwendet werden

Der JavaScript-Fehler "Iterator-Konstruktor kann nicht direkt verwendet werden" oder "AsyncIterator-Konstruktor kann nicht direkt verwendet werden" tritt auf, wenn Sie versuchen, die Iterator()- oder AsyncIterator()-Konstruktoren direkt zu verwenden, um Instanzen zu erstellen. Diese Konstruktoren sind abstrakte Klassen und sollten nur vererbt werden.

Nachricht

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 Iterator- und AsyncIterator-Konstruktoren sind abstrakte Klassen und sollten nicht direkt verwendet werden. Sie überprüfen den Wert von new.target und werfen einen Fehler, wenn dieser mit dem Konstruktor selbst übereinstimmt. Der einzige Weg, diese Konstruktoren zu verwenden, besteht darin, von ihnen in einer Unterklasse zu erben und super() im Konstruktor der Unterklasse aufzurufen. Die Unterklasse muss außerdem eine next()-Methode definieren, um nützlich zu sein.

Beispiele

Ungültige Fälle

js
new Iterator();

Gültige Fälle

js
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 { value: this.#step++, done: false };
    } else {
      return { done: true };
    }
  }
}

new MyIterator();

Siehe auch