我正在进行ng2实施。我使用以下函数调用将对象转换为数组:
var authors = Object.entries(responseObject.Authors);
这是标准的js功能。但是,ts编译器返回以下错误:
"Property 'entries' does not exist on type 'ObjectConstructor'"
基于快速谷歌,似乎解决方案可能是将compilerOptions目标属性从es5更改为es6。然而,在之前的一个问题的一些先前的研究之后,我认为我能够通过包含额外的" lib"来利用es6功能。我的tsconfig.json下面的属性:
"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()函数吗?
答案 0 :(得分:62)
您非常正确地认为更改target
是错误的方法,更改lib
是正确的方法,但是您指定了错误的语言版本。 According to MDN,Object.entries
已正式添加到ES2017规范中。
"lib": ["es2017"]
因此,必须指定*。
如果您希望仅添加 ES2017中添加的Object
函数方法的声明,TypeScript允许您指定{{3 }}
"lib": ["es2017.object"]
正如Alexander Bird所述,默认情况下,"lib"
选项的隐含值取决于"target"
指定的值(如果存在)。
例如:
"target": "es2017"
除非明确指定"lib.*"
,否则默认情况下会包含相应的带前缀的"lib"
。
请注意,您可能希望添加实现本身的填充a more granular value,以确保在较旧的运行时中有效。
注意:作为替代方案,您可以指定任何更高版本
"lib": ["es2018"]
或自然甚至
"lib": ["esnext"]
这最后将包括TypeScript语言已知的最新标准库功能的声明。因为它代表一个移动目标,所以应该小心使用此选项,因为根据定义,填充所有相应的运行时是一项需要研究的复杂任务,并且可能涉及根据目标运行时加载不同的polyfill。
注意:一些评论者问为什么更改--target
而不是--lib
是错误的,因为两者都会使代码输入检查?原因是--target
改变了代码的编译方式。例如,"target": "es2017"
表示async
函数无法针对较旧的运行时进行转换。这是不正确的,因为其意图是允许使用其他库,而不是更改输出语法,并且重要的是不要使用库功能完成语法功能。
答案 1 :(得分:11)
接受的答案对我不起作用,但是我像这样修改了Property 'assign' does not exist on type 'ObjectConstructor'中的答案:
const changedFields = (<any>Object).entries(this.ngForm.form.controls)
.filter(value => value[1].dirty);
为处于相同情况的任何人共享