属性 'entries' 在类型 'ObjectConstructor' 上不存在

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

我正在研究 ng2 实现。我正在使用以下函数调用将对象转换为数组:

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

这是一个标准的js函数。但是ts编译returns报如下错误:

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

基于快速 google 看来解决方案可能是将 compilerOptions 目标 属性 从 es5 更改为 es6。然而,在对之前的问题进行一些研究之后,我认为我可以通过在下面的 tsconfig.json 中包含额外的“lib”属性 来利用 es6 功能:

  "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() 函数吗?

您说得对,更改 target 是错误的方法,更改 lib 是正确的方法,但是您指定了错误的语言版本。 According to MDNObject.entries正式加入ES2017规范

"lib": ["es2017"]

因此您必须指定*。

如果您希望添加 Object 函数方法的声明,这些方法已添加到 ES2017 中, TypeScript 允许您指定 a more granular value.

"lib": ["es2017.object"]

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

例如:

"target": "es2017"

将导致默认包含相应的前缀 "lib.*",除非明确指定 "lib"

请注意,您可能希望添加实现本身的 polyfill,such as the this one,以确保它在较旧的运行时中有效。

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

"lib": ["es2020"]

或者自然地甚至

"lib": ["esnext"] 

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

此外,"lib" 选项的数组性质允许您组合多个值以匹配您的运行时。例如,要将支持 es2015 的 Web 浏览器与 polyfill 提供的这些对象方法相匹配,您可以编写

"lib": ["es2015", "es2017.object", "dom"]

有关更多详细信息,请参阅 TypeScript Handbook

注意: 一些评论者问为什么更改 --target 而不是 --lib 是错误的,因为两者都可以使代码进行类型检查?原因是 --target 改变了代码的转译方式。例如,"target": "es2017" 表示 async 函数不会针对较旧的运行时进行转换。这是不正确的,因为其目的是启用附加库的使用,而不是更改输出语法,因此区分语法特征和库特征很重要。

已接受的答案对我不起作用,但我改编了 的答案,如下所示:

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

分享给有相同情况的人

转到“tsconfig.json”并添加:

"lib": ["es2019"];