gpt4 book ai didi

javascript - 在 Typescript 中使用 AsyncIterator – 必需选项

转载 作者:行者123 更新时间:2023-12-02 23:18:22 25 4
gpt4 key购买 nike

考虑这个基本的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com