“ObjectConstructor”类型上不存在属性“条目”

IT技术 javascript angular typescript ecmascript-6 ecmascript-2017
2021-02-27 18:16:07

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

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

这是一个标准的js函数。但是,ts 编译器返回以下错误:

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

基于快速谷歌,似乎解决方案可能是将 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()功能吗?

2个回答

您完全正确,更改target是错误的方法,更改lib是正确的方法,但是您指定了错误的语言版本。根据 MDNObject.entries已正式添加到 ES2017 规范中。

"lib": ["es2017"]

因此是您必须指定的内容*。

如果您只想添加ES2017Object添加函数方法的声明,TypeScript 允许您指定更细粒度的 value

"lib": ["es2017.object"]

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

例如:

"target": "es2017"

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

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

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

"lib": ["es2020"]

甚至自然地

"lib": ["esnext"] 

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

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

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

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

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

@rjh Target 改变了代码的转换方式。例如,"target": "es2017"意味着async不会为较旧的运行时转换函数。这是不正确的,因为其意图是启用附加库的使用,而不是更改输出语法。
2021-04-16 18:16:07
@user8334943 不,您肯定需要 IE 10 的 polyfill。MDN 链接底部有浏览器支持信息。
2021-04-18 18:16:07
@AluanHaddad 肯定 :) 我同意尽可能长时间保持更新,我将很快执行更新。这是一个大型应用程序,有许多开发人员,因此需要计划更新。感谢您的输入!
2021-05-05 18:16:07
为什么更新lib而不是更新更正确target
2021-05-06 18:16:07
其他人注意:如果您还没有使用lib编译器选项,则可能有一个基于您的目标的默认值,当您设置lib. 有关默认值列表,请参阅编译器选项文档我必须lib为我的目标明确添加默认参数以及es2017.object.
2021-05-13 18:16:07

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

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

分享给有同样情况的人

在typescript游乐场中,您当前无法设置,--lib因此您必须使用隐式--target指定--lib
2021-04-17 18:16:07
你是英雄。我无法更改 lib,因为它是由另一个应用程序生成的,而我无法更改 tsconfig。
2021-04-20 18:16:07
谢谢 Nguyen ......我正在使用带有 typescript 2.6.2 的 Angular 6,这对我有用。如果有人能解释一下,我会很高兴的。
2021-04-28 18:16:07
在typescript游乐场为我工作。这是一些严肃的巫毒教
2021-05-16 18:16:07