财产条目'类型' ObjectConstructor'

时间:2017-07-31 18:08:05

标签: javascript angular typescript ecmascript-6 es2017

我正在进行ng2实施。我使用以下函数调用将对象转换为数组:

var authors = Object.entries(responseObject.Authors);

这是标准的js功能。但是,ts编译器返回以下错误:

"Property 'entries' does not exist on type 'ObjectConstructor'"

基于快速谷歌,似乎解决方案可能是将compilerOptions目标属性从es5更改为es6。然而,在之前的一个问题的一些先前的研究之后,我认为我能够通过包含额外的" lib"来利用es6功能。我的tsconfig.json下面的属性:

  "compilerOptions": {
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "module": "commonjs",
    "noEmitOnError": true,
    "noImplicitAny": false,
    "outDir": "../Scripts/",
    "removeComments": false,
    "sourceMap": true,
    "target": "es5",
    "moduleResolution": "node",
    "lib": [
      "es2015",
      "dom"
    ]
  }

我也尝试将目标属性更改为es2015,然后重建项目并执行" typescriptUsingTsConfig"但我仍然得到同样的错误。知道我可以在这里做什么来利用Object.entries()函数吗?

2 个答案:

答案 0 :(得分:62)

您非常正确地认为更改target是错误的方法,更改lib是正确的方法,但是您指定了错误的语言版本。 According to MDNObject.entries已正式添加到ES2017规范中。

"lib": ["es2017"]
因此,

必须指定*。

如果您希望仅添加 ES2017中添加的Object函数方法的声明,TypeScript允许您指定{{3 }}

"lib": ["es2017.object"]

正如Alexander Bird所述,默认情况下,"lib"选项的隐含值取决于"target"指定的值(如果存在)。

例如:

"target": "es2017"

除非明确指定"lib.*",否则默认情况下会包含相应的带前缀的"lib"

请注意,您可能希望添加实现本身的填充a more granular value,以确保在较旧的运行时中有效。

注意:作为替代方案,您可以指定任何更高版本

"lib": ["es2018"]

或自然甚至

"lib": ["esnext"]

这最后将包括TypeScript语言已知的最新标准库功能的声明。因为它代表一个移动目标,所以应该小心使用此选项,因为根据定义,填充所有相应的运行时是一项需要研究的复杂任务,并且可能涉及根据目标运行时加载不同的polyfill。

注意:一些评论者问为什么更改--target而不是--lib是错误的,因为两者都会使代码输入检查?原因是--target改变了代码的编译方式。例如,"target": "es2017"表示async函数无法针对较旧的运行时进行转换。这是不正确的,因为其意图是允许使用其他库,而不是更改输出语法,并且重要的是不要使用库功能完成语法功能。

答案 1 :(得分:11)

接受的答案对我不起作用,但是我像这样修改了Property 'assign' does not exist on type 'ObjectConstructor'中的答案:

const changedFields = (<any>Object).entries(this.ngForm.form.controls)
                                   .filter(value => value[1].dirty);

为处于相同情况的任何人共享