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

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

new MyIterator();

Siehe auch