考虑这个基本的 AsyncIterator Example from MDN :
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);
}
})();
在 Node 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.
TS manual提到了几个警告,但没有一个可以解决我的问题。奇怪的是,iterating async generators工作正常。
编译此示例需要哪些 tsconfig 选项?
最佳答案
进一步深入研究该问题后,发现这是由于多个问题造成的。
异步迭代器不能依赖其上下文(例如 this.i
)来访问不属于 AsyncIterator
接口(interface)的属性。这样做不会在当前版本的 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)是这样定义的:
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 });
}
};
}
};
关于javascript - 在 Typescript 中使用 AsyncIterator – 必需选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57063457/