如何将 Object.value 与类型脚本一起使用?

我试图从一个对象中分离出一个逗号字符串,

const data = {"Ticket-1.pdf":"8e6e8255-a6e9-4626-9606-4cd255055f71.pdf","Ticket-2.pdf":"106c3613-d976-4331-ab0c-d581576e7ca1.pdf"};
const values = Object.values(data).map(x => x.substr(0, x.length - 4));
const commaJoinedValues = values.join(',');
console.log(commaJoinedValues);

如何使用 TypeScript 做到这一点?

获取错误文件:

severity: 'Error'
message: 'Property 'values' does not exist on type 'ObjectConstructor'.'
at: '216,27'
source: 'ts'
165353 次浏览

而是使用 Object.keys。

const data = {
a: "first",
b: "second",
};


const values = Object.keys(data).map(key => data[key]);


const commaJoinedValues = values.join(",");
console.log(commaJoinedValues);

Object.values()ES2017的一部分,出现编译错误是因为需要将 TS 配置为使用 ES2017库。您可能正在当前 TS 配置中使用 ES6或 ES5库。

解决方案: 在你的 --lib编译器选项中使用 es2017或者 es2017.object

例如,使用 tsconfig.json:

"compilerOptions": {
"lib": ["es2017", "dom"]
}

注意,使用 TypeScript 对于 ES2017,< strong > not 在浏览器中发出填充来定位 ES2017(这意味着上面解决了你的 编译错误,但是你仍然会遇到一个 运行时间错误,因为浏览器没有实现 ES2017 Object.values) ,如果你愿意,你可以自己填写你的项目代码。由于 Object.values尚未得到所有浏览器的良好支持(在撰写本文时)您肯定需要填充: core-js完成任务

我刚用 Angular 6解决了这个问题,使用 CLI 和工作区创建了一个使用 ng g library foo的库。

在我的案例中,问题出现在库文件夹中的 tsconfig.lib.json中,而 lib部分中没有包含 es2017

任何人偶然发现这个问题与角度6你只需要确保你更新你的 tsconfig.lib.json以及你的应用程序 tsconfig.json

如果由于某种原因无法在 tsconfig 中更新到 ES7,那么可以通过执行此 (<any>Object).values(data)来在 TypeScript 中使用 Object.values

而不是

Object.values(myObject);

使用

Object["values"](myObject);

在你的例子中:

const values = Object["values"](data).map(x => x.substr(0, x.length - 4));

这将隐藏 ts 编译器错误。

最简单的方法是将 Object转换为 any,像这样:

const data = {"Ticket-1.pdf":"8e6e8255-a6e9-4626-9606-4cd255055f71.pdf","Ticket-2.pdf":"106c3613-d976-4331-ab0c-d581576e7ca1.pdf"};
const obj = <any>Object;
const values = obj.values(data).map(x => x.substr(0, x.length - 4));
const commaJoinedValues = values.join(',');
console.log(commaJoinedValues);

瞧——没有编译错误;)

更简单的是,使用 underscore.js 中的 _.values Https://underscorejs.org/#values

这里的 tslint规则配置总是用 Object.values(myObject)代替 Object["values"](myObject)行。

如果你有同样的问题,有两种选择:

(Object as any).values(myObject)

或者

/*tslint:disable:no-string-literal*/
`Object["values"](myObject)`

我在 tsconfig.json中增加了目标,以便在 TypeScript 中启用这个特性

{
"compilerOptions": {
"target": "es2017",
......
}
}