javascript - Hur man yield* arrayer i Typescript


Jag har en generator-metod som lägger till saker asynkront i en array och i slutet returnerar varje medlem med yield* array så här:

while (!done) {
      await promise;
      yield* results; //<-- the array
      results = [];  //its emptied so as to not to yield dupes
      done = !this.#eventsListened.has(eventName);
    }

Men vår vänliga granne tsc rapporterar ett fel och jag kan inte ens börja förstå det eller hur man fixar det. Kan någon förklara vad detta fel betyder och hur jag då ska hämta innehållet i en array?

TS2766: Kan inte delegera iteration till värde eftersom metoden 'next' på dess iterator förväntar sig typen 'undefined', men den innehållande generatorn kommer alltid att skicka 'unknown'.

Redigera: hela generatorfunktionen följer

  /**
   * Returns an iterator that loops over caught events
   * @yields Promise<Event|CustomEvent>
   */
  async *on(eventName: string, options?: AddEventListenerOptions): AsyncGenerator<Event> {
    if (this.#eventsListened.has(eventName)) {
      return;
    }
    let results: Event[] = [];

    let resolve: (value?: PromiseLike<Event> | Event) => void;

    let promise = new Promise<Event>(r => (resolve = r));
    let done = false;
    this.#eventsListened.add(eventName);

    if (typeof options === 'object' && typeof options.once !== 'undefined') {
      throw new Error('options.once is not supported. Use EventTarget2.once instead');
    }
    const callback = (evt: Event) => {
      results.push(evt);
      resolve();
      promise = new Promise<Event>(r => (resolve = r));
    };

    this.addEventListener('eventName', callback, options);
    while (!done) {
      await promise;
      yield* results;
      results = [];
      done = !this.#eventsListened.has(eventName);
    }
    this.removeEventListener(eventName, callback);
  }

Svar #1

Ditt huvudproblem är AsyncGenerator<Event> ... Eftersom du inte angav den tredje generiska parametern används standardvärdet (unknown), och unknown stämmer inte överens med undefined.

Mismatchen uppstår eftersom den inre iteratorn inte förväntar sig några värden som skickas in i iteratorn via next(value), därför är dess TNext generiska parameter undefined. När du yield* den iteratorn, kommer ett anrop av next(...) på din generators iterator att kalla den inre iteratorn med samma argument, därför måste argumenten stämma överens.

Typescript härleder typen av en generatorfunktion till AsyncGenerator<..., ..., undefined> av precis den anledningen, och du bör göra detsamma (så länge du inte vill skicka värden till iteratorn med .next): AsyncGenerator<Event, void, undefined>.

Relaterade artiklar