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)
你的主要问题是AsyncGenerator<Event>......由于你没有指定第三个通用参数,它的默认值 ( unknown) 被使用,并且unknownmismatches undefined。
发生不匹配是因为内部迭代器不希望通过 传递给迭代器的任何值next(value),因此它的TNext通用参数是undefined。作为yield*迭代器,调用next(...)生成器迭代器将调用具有相同参数的内部迭代器,因此参数必须匹配。
正是AsyncGenerator<..., ..., undefined>出于这个原因,Typescript 推断生成器函数的类型,您也应该这样做(只要您不想使用 将值传递给迭代器.next): AsyncGenerator<Event, void, undefined>。
| 归档时间: |
|
| 查看次数: |
1756 次 |
| 最近记录: |