TypeScript 2.8.3 Type必须具有一个返回迭代器的Symbol.iterator方法

Tom*_*uer 3 typescript

我遇到一个错误,提示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目标,并增加了esnextdomes2018。这对错误的影响为零。

我会错过更多lib条目吗(我怀疑这些条目是包含所有内容的通用条目)还是我使用的代码无效?

Wil*_*Hou 34

我认为如果将“this.test()”转换为stringarray,您可以消除错误。

我的情况有所不同,但我认为我的解决方案可能会帮助一些开发人员。

我收到的错误消息是:

     Type 'Ingredient | Ingredient[]' must have a '[Symbol.iterator]()' 
     method that returns an iterator
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我尝试了几种方法,以下三种方法有效,第一种方法简单:

在此输入图像描述

在此输入图像描述

在此输入图像描述

  • 这是最直接、最相关、对其他人来说最有帮助的。谢谢你! (2认同)

nav*_*gar 23

当我们尝试使用展开语法 (...) 来解压数组中的对象时,会出现错误“Type Object 必须具有返回迭代器的 Symbol.iterator 方法”。要解决该错误,请将对象包装在数组中或更正您的输入。

\n

像这样..

\n
const 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];\n
Run 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\'}]\n
Run Code Online (Sandbox Code Playgroud)\n

来源在这里

\n

  • 这个评论让我意识到我做错了什么 (2认同)

jca*_*alz 15

正如我在上面评论的那样,不幸的是,异步迭代器目前不支持扩展运算符。GitHub 中的相关问题是tc39/proposal-async-iteration#103

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

@jedwards1211 说:

数组扩展运算符支持是否会成为该提案的一部分?

@domenic 回答:

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

而且我在其他地方没有看到提案(想开始一个?)。无论如何,因为它甚至不是 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)

  • 请至少添加对其工作原理的简短解释。它将帮助人们理解事物而不是相信魔法。 (10认同)
  • @IlyaEremin https://github.com/microsoft/TypeScript/blob/master/lib/lib.dom.iterable.d.ts (3认同)
  • 你真的只需要“dom”,“dom.iterable”,但它的作用就像一个魅力 (3认同)

Est*_*ask 9

尽管语法可能表明什么,但异步生成器函数并非如此async返回生成器的函数。

正如提案所述,

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

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

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

由于异步生成器具有Symbol.asyncIterator而不是Symbol.iterator,因此它是不可迭代的迭代器,即它不能使用常规 ES6 方法(Array.fromfor..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 迭代方法中对异步迭代器的支持可能会发生变化。