我遇到一个错误,提示Type必须具有[Symbol.iterator]()返回迭代器的' '方法。。它希望在分界线上:
class Test {
private async do() {
const done = [...(await this.test())]; // Here's the error
}
private async *test(): AsyncIterableIterator<string> {
return;
}
}
Run Code Online (Sandbox Code Playgroud)
我在TypeScript GitHub存储库中发现了一些问题,但似乎没有任何帮助。他们都建议向添加新条目lib。我使用的es6目标,并增加了esnext,dom和es2018。这对错误的影响为零。
我会错过更多lib条目吗(我怀疑这些条目是包含所有内容的通用条目)还是我使用的代码无效?
Wil*_*Hou 34
我认为如果将“this.test()”转换为string或array,您可以消除错误。
我的情况有所不同,但我认为我的解决方案可能会帮助一些开发人员。
我收到的错误消息是:
Type 'Ingredient | Ingredient[]' must have a '[Symbol.iterator]()'
method that returns an iterator
Run Code Online (Sandbox Code Playgroud)
我尝试了几种方法,以下三种方法有效,第一种方法最简单:
nav*_*gar 23
当我们尝试使用展开语法 (...) 来解压数组中的对象时,会出现错误“Type Object 必须具有返回迭代器的 Symbol.iterator 方法”。要解决该错误,请将对象包装在数组中或更正您的输入。
\n像这样..
\nconst obj = { name: \'James\' };\n\n// \xe2\x9b\x94\xef\xb8\x8f Error: Type Object must have a \'[Symbol.iterator]()\'\n// method that returns an iterator.ts(2488)\nconst result = [...obj];\nRun Code Online (Sandbox Code Playgroud)\n我们尝试使用扩展语法将对象的属性直接解压到数组中。
\n此问题的解决方案取决于您的用例。如果要将对象解压到数组中,请在使用展开语法 (...) 之前将其包装在数组中。
\n const obj = { name: \'James\' };\n\nconst result = [...[obj]];\n\nconsole.log(result); // \xef\xb8\x8f [{name: \'James\'}]\nRun Code Online (Sandbox Code Playgroud)\n来源在这里
\njca*_*alz 15
正如我在上面评论的那样,不幸的是,异步迭代器目前不支持扩展运算符。GitHub 中的相关问题是tc39/proposal-async-iteration#103。
回顾那个问题(减去无关的东西,比如“你可以这样做,哎呀,你不能,没关系”):
数组扩展运算符支持是否会成为该提案的一部分?
不是这个提案的一部分……另一个提案当然可以在这里考虑一些新的东西。
而且我在其他地方没有看到提案(想开始一个?)。无论如何,因为它甚至不是 JavaScript ESNext 的一部分,所以它很可能不会被添加到 TypeScript 中。
最可行的替代方法是@estus's answer 中for await详述的语法。抱歉,我帮不上忙了。祝你好运!
Roh*_*pta 11
这帮助了我。在tsconfig中,添加以下内容:
{
"compilerOptions": {
"lib": [
"es5", "es6", "dom", "dom.iterable"
]
}
}
Run Code Online (Sandbox Code Playgroud)
尽管语法可能表明什么,但异步生成器函数并非如此async返回生成器的函数。
正如提案所述,
异步生成器函数与生成器函数类似,但有以下区别:
调用时,异步生成器函数返回一个对象,即一个异步生成器,其方法(next、throw 和 return)返回 { value, did } 的承诺,而不是直接返回 { value, did }。这会自动使返回的异步生成器对象成为异步迭代器。
它返回异步生成器,而不是承诺,因此await它没有任何好处。
由于异步生成器具有Symbol.asyncIterator而不是Symbol.iterator,因此它是不可迭代的迭代器,即它不能使用常规 ES6 方法(Array.from、for..of、扩展语法等)进行迭代。这就是为什么for await..of这就是引入的
上面的代码应该是:
const values = [];
for await (const value of this.test()) {
values.push(v);
}
Run Code Online (Sandbox Code Playgroud)
异步迭代器上的迭代可以与常规迭代器类似地进行脱糖处理,不同之处在于它next()返回下一个值的承诺,而不是值本身:
const iterator = this.test();
let next;
while ((next = await iterator.next()).done === false) {
values.push(next.value);
}
Run Code Online (Sandbox Code Playgroud)
由于异步生成器规范是一个提案,因此 ES6 迭代方法中对异步迭代器的支持可能会发生变化。
| 归档时间: |
|
| 查看次数: |
10686 次 |
| 最近记录: |