javascript - 如何在 Typescript 中生成 * 数组

标签 javascript arrays typescript async-await generator

我有一个生成器方法,它可以向数组异步添加一些内容,最后使用 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);
    }

但是我们友好的邻居 tsc 报告了一个错误,我什至无法开始理解它或如何修复它。谁能解释一下这个错误是什么意思以及我应该如何生成数组的内容?

TS2766: Cannot delegate iteration to value because the 'next' method of its iterator expects type 'undefined', but the containing generator will always send '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);
  }

最佳答案

您的主要问题是AsyncGenerator<Event> ...由于您没有指定第三个通用参数,因此使用默认值( unknown ),并且 unknown不匹配undefined

发生不匹配是因为内部迭代器不期望通过next(value)传递到迭代器的任何值。 ,因此它是 TNext通用参数是 undefined 。正如你yield*该迭代器,调用 next(...)在你的生成器上迭代器将使用相同的参数调用内部迭代器,因此参数必须匹配。

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

关于javascript - 如何在 Typescript 中生成 * 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61197807/

相关文章:

javascript - Uncaught ReferenceError , "..."未定义

c# - 通过标签创建许多对象的数组/列表(最初未知数量)

javascript - 将对象属性解构为数组值

javascript - HTML5 游戏通过按下按钮移动 Sprite

javascript - 使用此语法的正确术语 &lt;script src ="script.js">&lt;/script&gt;

javascript - 为什么将输入值设置为 undefined 不为空呢?

javascript - 使用Google脚本数组中的搜索功能

javascript - 将属性添加到 array.reduce() 返回对象的顺序

reactjs - 如何扩展 React 函数组件 Prop 类型?

typescript - 如何在 Typescript 中将类型转换为接口(interface)