【问题标题】:TypeScript and Iterator: Type 'IterableIterator<T>' is not an array typeTypeScript 和 Iterator:类型 'IterableIterator<T>' 不是数组类型
【发布时间】:2018-08-19 12:01:49
【问题描述】:

当我在 TypeScript 上使用 yield* expression 时,它总是会出错。

类型“IterableIterator”不是数组类型。

如何在不使用any 的情况下正确设置类型以避免错误?

function* g1(): IterableIterator<number> {
  yield 2;
  yield 3;
  yield 4;
}

function* g2(): IterableIterator<number> {
  yield 1;
  // ERROR: Type 'IterableIterator<number>' is not an array type.
  yield* g1();
  yield 5;
}

const iterator = g2();

【问题讨论】:

    标签: typescript


    【解决方案1】:

    如果可能,将 tsconfig 中的目标更新为 es2015(或更高)以解决错误而不启用下层迭代`:

    {
      "compilerOptions": {
        "target": "es2015"
      }
    }
    

    如果您以 es5 为目标,请在 tsconfig 中显式启用 downLevelIteration

    {
      "compilerOptions": {
        "target": "es5",
        "downlevelIteration": true
      }
    }
    

    【讨论】:

    • 这不是默认设置的原因吗?
    • @Ben 我记得在一些 GitHub 问题上读到,团队对生成的代码很丑陋并且不真正符合生成可读 JS 的 TS 设计目标这一事实并不特别高兴。
    • 讽刺!老派for (let i = 0; i &lt; arr.length; i++) 比任何(这些炫耀)for-of 数组都更具可读性:)
    • 如果您使用 VSC,只需重新启动它以进行更改
    • @Kariamoss 是的,不幸的是有时需要重述。 “重启 ts 服务器”命令也是重启 ts 语言服务的好选择
    【解决方案2】:
    tsc demo.ts --lib "es6","dom" --downLevelIteration
    

    使用此命令进行编译。它将解决问题。如果 tsconfig.json 是使用 target:es5 创建的,在 tsconfig.json 中添加这些值不会解决问题。手动更新 tsconfig.json 将不起作用。使用此命令,只需更改 .ts 文件的名称即可。

    【讨论】:

    • 如果在您的 tsconfig.json 文件中添加 downlevelIteration 参数没有解决问题,则说明有问题。也许您修改了错误的 tsconfig.json 文件?或者该参数可能在继承的 tsconfig 中被覆盖?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 2020-08-22
    • 2021-06-04
    • 2018-09-19
    • 2021-09-11
    • 2015-06-07
    相关资源
    最近更新 更多