TypeScript 2.8.3类型必须具有返回迭代器的Symbol.iterator方法

TypeScript 2.8.3类型必须具有返回迭代器的Symbol.iterator方法,typescript,Typescript,我遇到了一个错误,说 Type must have a '[Symbol.iterator]()' method that returns an iterator. 它希望在划界线上: class Test { private async do() { const done = [...(await this.test())]; // Here's the error } private async *test(): AsyncIterableIter

我遇到了一个错误,说

Type must have a '[Symbol.iterator]()' method that returns an iterator.
它希望在划界线上:

class Test {
    private async do() {
        const done = [...(await this.test())]; // Here's the error
    }

    private async *test(): AsyncIterableIterator<string> {
        return;
    }
}
类测试{
私有异步do(){
const done=[…(等待这个.test())];//下面是错误
}
专用异步*测试():AsyncIterableIterator{
返回;
}
}
我在TypeScript GitHub存储库中发现了一些问题,但似乎没有一个有帮助。他们都建议在
lib
中添加新条目。我正在使用
es6
目标,并添加了
esnext
dom
es2018
。这对错误没有任何影响


我是否遗漏了更多的
lib
条目(我怀疑我正在使用的条目是否是包含所有内容的catchall条目),或者我正在使用的代码是否无效?

不管语法如何,异步生成器函数不是返回生成器的
async
函数

作为国家

异步生成器函数与生成器函数类似,但有以下区别:

调用时,异步生成器函数返回一个对象,即一个异步生成器,其方法(next、throw和return)返回{value,done}的承诺,而不是直接返回{value,done}。这会自动使返回的异步生成器对象成为异步迭代器

它返回异步生成器,而不是承诺,因此
wait
ing它没有任何好处

由于异步生成器具有
Symbol.asyncIterator
而不是
Symbol.iterator
,因此它是不可迭代的迭代器,即不能使用常规ES6方法进行迭代(
Array.from
for..of
,扩展语法等)。这就是引入wait..of的原因

上述代码应为:

const values = [];

for await (const value of this.test()) {
  values.push(v);
}
异步迭代器上的迭代可以类似于常规迭代器进行分解,区别在于
next()
返回下一个值的承诺,而不是值本身:

const iterator = this.test();
let next;
       
while ((next = await iterator.next()).done === false) {
  values.push(next.value);
}

由于asynchronous generator规范是一项建议,ES6迭代方法中对异步迭代器的支持可能会发生变化。

正如我在上面所评论的,不幸的是,异步迭代器目前不支持spread运算符。GitHub中的相关问题是

回顾一下那个问题(减去一些无关的东西,比如“你可以这样做,哦,不,你不能,没关系”):

阵列扩展运营商支持是否会成为该提案的一部分

不是这个提议的一部分。。。另一项提案当然可以在这里考虑一些新的东西

我在其他地方没有看到提案(想吗?)。无论如何,因为它甚至不是JavaScript ESNext的一部分,所以它很可能不会被添加到TypeScript中

最可行的替代方法是wait的
语法,详见。对不起,我帮不上忙了。祝你好运

这对我有帮助。 在tsconfig中,添加以下内容:

{
    "compilerOptions": {
        "lib": [
            "es5", "es6", "dom", "dom.iterable"
        ]
    }
}
这是tsconfig在传输代码时知道要导入哪些接口所必需的

dom.iterable包括此处提到的所有接口:


还要感谢@domlas提到这一点。我已经更新了他的评论,因此它被视为默认原因。

看起来异步可编程逻辑不支持扩展运算符:回答很好,谢谢,我知道wait的
,但不知道如何使用@jcalz处理的扩展运算符,所以我倾向于接受他们的答案,然而,你的也非常棒,我对它投了更高的票。@IlyaEremin请至少简单解释一下它的工作原理。它将帮助人们理解事物,而不是相信魔法@सत्यमेवजयते, 我编辑过这个。谢谢你的建设性评论。道歉。我必须添加
tsconfig.json
tsconfig.base.json
然后它就工作了是的,我正在使用angular。