类型“ObjectConstructor”上不存在属性“entries”

2023-12-10

我正在研究 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()功能?


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

"lib": ["es2017"]

因此您必须指定*。

如果您想添加only方法的声明Object函数是added inES2017,TypeScript 允许你指定更细粒度的值.

"lib": ["es2017.object"]

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

例如:

"target": "es2017"

会导致相应的前缀"lib.*"默认情况下包含在内,除非"lib"被明确指定。

请注意,您可能希望添加实现本身的填充,比如这个,以确保这在较旧的运行时中有效。

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

"lib": ["es2020"]

或者自然地甚至

"lib": ["esnext"] 

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

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

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

See the TypeScript 手册了解更多详细信息。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类型“ObjectConstructor”上不存在属性“entries” 的相关文章

随机推荐