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