属性 '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 MDN、Object.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"];
我正在研究 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 MDN、Object.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"];