[英]Use AsyncIterator in Typescript – required options
考慮以下來自MDN的基本AsyncIterator示例 :
var asyncIterable = {
[Symbol.asyncIterator]() {
return {
i: 0,
next() {
if (this.i < 3) {
return Promise.resolve({ value: this.i++, done: false });
}
return Promise.resolve({ done: true });
}
};
}
};
(async function() {
for await (let num of asyncIterable) {
console.log(num);
}
})();
在節點10.16.0上運行它可以正常工作。 但是,我似乎無法使其通過Typescript運行。 使用以下tsconfig:
{
"compilerOptions": {
"lib": ["es2016", "esnext.asynciterable"],
"target": "es2016"
}
}
結果錯誤The type returned by the 'next()' method of an async iterator must be a promise for a type with a 'value' property.
目標esnext
錯誤相同。
如果我完全刪除target
選項, Type '{ [Symbol.asyncIterator](): { i: number; next(): Promise<{ done: boolean; }>; }; }' is not an array type or a string type.
得到一個Type '{ [Symbol.asyncIterator](): { i: number; next(): Promise<{ done: boolean; }>; }; }' is not an array type or a string type.
Type '{ [Symbol.asyncIterator](): { i: number; next(): Promise<{ done: boolean; }>; }; }' is not an array type or a string type.
TS手冊中提到了幾個警告,但沒有一個可以解決我的問題。 奇怪的是, 迭代異步生成器可以正常工作。
使該示例編譯需要哪些tsconfig選項?
在深入研究問題之后,似乎是由於這里存在多個問題。
異步迭代器不能依賴其上下文(例如this.i
)來訪問不屬於AsyncIterator
接口的屬性。 這樣做將無法在當前版本的TypeScript 3.6中進行編譯(即使它在JavaScript中也可以正常工作),因此要解決此問題,我們需要處理以下問題:
var asyncIterable = {
[Symbol.asyncIterator]() {
let i = 0;
return {
next() {
if (i < 3) {
return Promise.resolve({ value: i++, done: false });
}
return Promise.resolve({ done: true });
}
};
}
};
現在,問題似乎與第二個return語句中缺少value
有關。 因為IteratorResult
接口的定義如下:
interface IteratorResult<T> {
done: boolean;
value: T;
}
next()
方法必須始終返回一個具有value: number
的對象(同樣,即使它在JavaScript中工作正常),所以最終我們有了:
var asyncIterable = {
[Symbol.asyncIterator]() {
let i = 0;
return {
next() {
if (i < 3) {
return Promise.resolve({ value: i++, done: false });
}
return Promise.resolve({ value: i, done: true });
}
};
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.