TypeError: Iterator/AsyncIterator constructor can't be used directly

The JavaScript exception "Iterator constructor can't be used directly" or "AsyncIterator constructor can't be used directly" occurs when you try to use the Iterator() or AsyncIterator() constructors directly to create instances. These constructors are abstract classes and should only be inherited from.

Message

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)

Error type

What went wrong?

The Iterator and AsyncIterator constructors are abstract classes and should not be used directly. They check the value of new.target and throw if it is the same as the constructor itself. The only way to use these constructors is to inherit from them in a subclass and call super() in the subclass constructor. The subclass must also define a next() method to be useful.

Examples

Invalid cases

js
new Iterator();

Valid cases

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();

See also