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

新手上路,请多包涵

我遇到了一个错误,上面写着

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;
    }
}

我在 TypeScript GitHub 存储库中发现了一些问题,但似乎没有任何帮助。他们都建议向 lib 添加新条目。我正在使用 es6 目标并添加了 esnextdomes2018 这对错误的影响为零。

我是否错过了更多 lib 条目(我怀疑我使用的是包含所有内容的包罗万象的条目)还是我使用的代码无效?

原文由 Tomáš Hübelbauer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 8.7k
2 个回答

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

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

@jedwards1211 说:

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

@domenic 回答:

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

而且我在其他地方看不到提案(想 开始一个?)。无论如何,由于它甚至不是 JavaScript ESNext 的一部分,它很可能不会被添加到 TypeScript 中。

最可行的替代方案是 for await 语法在 @estus 的答案 中详述。抱歉,我无法提供更多帮助。祝你好运!

原文由 jcalz 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

像这样..

 const obj = { name: 'James' };

// ⛔️ Error: Type Object must have a '[Symbol.iterator]()'
// method that returns an iterator.ts(2488)
const result = [...obj];

我们尝试使用扩展语法将对象的属性直接解包到数组中。

解决方案取决于您的用例。如果要将对象解包到数组中,请在使用扩展语法 (…) 之前将其包装在数组中。

  const obj = { name: 'James' };

const result = [...[obj]];

console.log(result); // 👉️ [{name: 'James'}]

原文由 dev.sochokuchnaya.com 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Stack Overflow 翻译
子站问答
访问
宣传栏