打字稿错误:Map.values()赋予IterableIterator不可迭代

时间:2016-11-25 06:25:02

标签: javascript typescript

当我尝试迭代从Map.values()返回的值时,

Typescript会给我这个错误(其中Map的类型为< number,Foo>):

  

错误TS2495:输入'IterableIterator< Foo>'不是数组类型或字符串类型。

根据ES6 doc Map.values()应该返回Iterable而不是IterableIterator,我应该能够在for-for循环中使用它。

这在node

中工作正常
var data = [
  {id: 0},
  {id: 1},
  {id: 3}
];
var m = new Map(data.map(n => [n.id,n]));
for(var i of m.values()) { console.log(i) }

这会从tsc

中产生错误
interface Foo {
  id: number;
}
var data: Foo[] = [
  {id: 0},
  {id: 1},
  {id: 2}
];
var m = new Map<number,Foo>(data.map(n => <[number,Foo]>[n.id,n]));
for(var i of m.values()) { console.log(i) }

我从@types/core-js@0.9.34获取地图声明,所以我猜这个问题出现在这个声明中?

其他版本&amp; conf info:

> tsc --version
Version 2.0.3
> cat tsconfig.json 
{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": true,
    "suppressImplicitAnyIndexErrors": true,
    "typeRoots": [
      "./node_modules/@types/"
    ]
  },
  "compileOnSave": true,
  "exclude": [
    "node_modules/*",
    "**/*-aot.ts"
  ]
}

1 个答案:

答案 0 :(得分:1)

我不了解tsc正在做tsconfig.json的一些隐含内容。阅读tsconfig.json doc让事情变得更加清晰:

首先,我正在像这样tsc mytypescript.ts进行转换,它(愚蠢地)导致Typescript默默地忽略 tsconfig.json 文件,这意味着它使用默认的ES5。但是这部分有效,因为tsc仍然找到core-js声明,其中包含ES6事件的声明,例如Map,Iterable等。这让我的调试有点了。

其次,在使用Typescript实际接收我的配置后,无论如何配置都是错误的。我实际上并不需要或想要来自@types/core-js的声明(非常肯定)。是的,我会在我的项目中使用core-js作为polyfill,但typescript/lib/lib.es6.d.ts中的ES6内容的Typescript comes with it's own声明,以及@types/core-js中的那些声明是古怪的,糟糕的或类似的东西...