如何将Object.values与typescript一起使用?

时间:2017-03-23 02:50:08

标签: typescript object

我正在尝试从对象中形成逗号分隔的字符串

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'

9 个答案:

答案 0 :(得分:172)

Object.values()part of ES2017,您得到的编译错误是因为您需要配置TS以使用ES2017库。您可能正在使用当前TS配置中的ES6或ES5库。

解决方案:在--lib compiler option中使用es2017es2017.object

例如,使用tsconfig.json

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

请注意,使用TypeScript 定位ES2017 在ES2017的浏览器中发出polyfill ,如果您愿意,可以自行在项目中执行此操作。由于Object.values is not yet well supported by all browsers您确实需要填充:core-jsdo the job

答案 1 :(得分:76)

使用Object.keys代替。

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

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

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

答案 2 :(得分:12)

如果出于某种原因无法在tsconfig中更新为ES7,则可以通过执行此操作Object.values在TypeScript中使用(<any>Object).values(data)

答案 3 :(得分:11)

代替

Object.values(myObject);

使用

Object["values"](myObject);

在您的示例情况下:

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

这将隐藏ts编译器错误。

答案 4 :(得分:6)

我在tsconfig.json中增加了在TypeScript中启用此功能的目标

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

答案 5 :(得分:4)

我刚刚使用CLI和工作区使用Angular 6解决了这个问题,使用library(tidyverse) df %>% gather(what, val, -id) %>% ggplot(aes(val, fill = what)) + geom_histogram() + facet_wrap(~id) 创建了一个库。

就我而言,问题发生在库文件夹中的ng g library footsconfig.lib.json部分中没有es2017

任何在Angular 6中遇到此问题的人都需要确保您更新lib以及您的应用tsconfig.lib.json

答案 6 :(得分:1)

在这里,我的tslint规则配置始终将Object["values"](myObject)行替换为Object.values(myObject)

如果您遇到相同的问题,则有两个选择:

(Object as any).values(myObject)

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

答案 7 :(得分:-3)

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

答案 8 :(得分:-4)

最简单的方法是将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);

还有瞧-没有编译错误;)