如何在打字稿中产生*数组

Dav*_*nto 3 javascript arrays generator async-await typescript

我有一个生成器方法,它异步地向数组添加一些东西,最后产生每个成员,yield* array如下所示:

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

然而,我们友好的邻居 tsc 报告了一个错误,我什至无法理解它或如何修复它。任何人都可以解释这个错误是什么意思,然后我应该如何产生数组的内容?

TS2766:无法将迭代委托给 value,因为其迭代器的“next”方法需要类型“undefined”,但包含生成器将始终发送“unknown”。

编辑:整个生成器功能如下

  /**
   * 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);
  }
Run Code Online (Sandbox Code Playgroud)

Jon*_*lms 5

你的主要问题是AsyncGenerator<Event>......由于你没有指定第三个通用参数,它的默认值 ( unknown) 被使用,并且unknownmismatches undefined

发生不匹配是因为内部迭代器不希望通过 传递给迭代器的任何值next(value),因此它的TNext通用参数是undefined。作为yield*迭代器,调用next(...)生成器迭代器将调用具有相同参数的内部迭代器,因此参数必须匹配。

正是AsyncGenerator<..., ..., undefined>出于这个原因,Typescript 推断生成器函数的类型,您也应该这样做(只要您不想使用 将值传递给迭代器.next): AsyncGenerator<Event, void, undefined>

  • 谢谢!这成功了...我不知道 AsyncGenerator 接口有三种类型。我仍然对你可以向迭代器发送一个值感到困惑。 (2认同)