"ObjectConstructor"类型中不存在属性"条目"

use*_*943 45 javascript typescript ecmascript-6 angular es2017

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

var authors = Object.entries(responseObject.Authors);
Run Code Online (Sandbox Code Playgroud)

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

"Property 'entries' does not exist on type 'ObjectConstructor'"
Run Code Online (Sandbox Code Playgroud)

基于快速谷歌,似乎解决方案可能是将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"
    ]
  }
Run Code Online (Sandbox Code Playgroud)

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

Alu*_*dad 78

你是非常正确的,改变target是错误的方法,改变lib是正确的方法,但是你已经指定了错误的语言版本.根据MDN,Object.entries正式添加在ES2017规范中.

"lib": ["es2017"]
Run Code Online (Sandbox Code Playgroud)

因此,你必须指定*.

如果您只想添加 ES2017 Object添加的函数方法的声明,TypeScript允许您指定更精细的值

"lib": ["es2017.object"]
Run Code Online (Sandbox Code Playgroud)

正如Alexander Bird所述,默认情况下,该"lib"选项的隐含值取决于为"target"if表示的值.

例如:

"target": "es2017"
Run Code Online (Sandbox Code Playgroud)

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

请注意,您可能希望添加实现本身的polyfill,例如此实现,以确保它在较旧的运行时中有效.

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

"lib": ["es2020"]
Run Code Online (Sandbox Code Playgroud)

或者自然甚至

"lib": ["esnext"] 
Run Code Online (Sandbox Code Playgroud)

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

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

  • @rjh Target 更改代码的转译方式。例如,“target”:“es2017”意味着“async”函数不会针对较旧的运行时进行转换。这是不正确的,因为目的是允许使用附加库,而不是更改输出语法。 (2认同)

Hie*_*yen 17

接受的答案对我不起作用,但我改编了来自“ObjectConstructor”类型不存在属性“assign”的答案,如下所示:

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

分享给有同样情况的人

  • 谢谢 Nguyen......我正在使用 Angular 6 和 typescript 2.6.2,这对我有用。如果有人能解释一下,我会很高兴。 (2认同)