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

use*_*016 122 object typescript

我试图从一个对象形成一个逗号分隔的字符串,

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);
Run Code Online (Sandbox Code Playgroud)

如何使用TypeScript执行此操作?

获取错误文件:

severity: 'Error'
message: 'Property 'values' does not exist on type 'ObjectConstructor'.'
at: '216,27'
source: 'ts'
Run Code Online (Sandbox Code Playgroud)

Aar*_*all 198

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

解决方案:使用es2017es2017.object--lib编译器选项中.

例如,使用tsconfig.json:

"compilerOptions": {
    "lib": ["es2017", "dom"]
}
Run Code Online (Sandbox Code Playgroud)

请注意,以打字稿目标ES2017 没有在浏览器ES2017发出polyfills,它给你,如果你想要做的是,在你的项目中自己.而且,由于Object.values尚未得到所有浏览器的良好支持,您肯定需要一个polyfill:Object.values完成这项工作.

  • ^要回答我自己的问题:`tsc --init`注释中列出了`ES2017`,`DOM`(大写)作为有效值,它在编译器中可以正常工作,但是[JSON模式](https:/ /github.com/SchemaStore/schemastore/blob/master/src/schemas/json/tsconfig.json)仅枚举`es2017`,`dom`(小写)选项,因此JSON IDE / linter将标记`ES2017`,` DOM`为无效值(即使它们是有效的)。有点混乱。 (2认同)

hol*_*ava 90

而是使用Object.keys.

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

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

const commaJoinedValues = values.join(",");
console.log(commaJoinedValues);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这是一个替代方案(一个好的!),而不是关于如何在TS中使用ES7的`Object.values`来解决OP的编译错误的实际答案.要做到这一点,你只需要在`--lib`设置中使用`ES2017`. (83认同)
  • @ holi-jave这不是"我的解决方案"它只是TS和非标准的JS功能如何工作,就像OP试图使用`ES7/Object.values()`.也许你认为它的复杂性(我并不反对),但这只是今天试图使用像`Object.values()`这样的未来特性的本质.它总是这样.如果你的目标是ES3或希望支持IE8,甚至`Object.keys()`仍然应该是polyfilled的(希望你不再支持!)一般来说理解ES功能,浏览器支持和polyfilling是个好主意在网站开发! (7认同)
  • @Aaron你的解决方案是如此复杂,任何新的打字稿都不能接受,编译你必须添加`ES2017` lib,并且必须包括polyfills库使用it.give对不同的人的不同答案是王道. (3认同)

mtp*_*ltz 17

如果由于某种原因无法在tsconfig中更新为ES7,则可以Object.values在TypeScript 中使用(<any>Object).values(data).

  • @Aaron发布时,有评论表明使用特定版本Angular的人在更新无法使用的lib时遇到问题。这就是为什么我将“如果由于某些原因您无法在tsconfig中更新到ES7”的原因 (2认同)

Luk*_*ius 12

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

{
    "compilerOptions": {
        "target": "es2017",
        ......
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 11

代替

Object.values(myObject);
Run Code Online (Sandbox Code Playgroud)

使用

Object["values"](myObject);
Run Code Online (Sandbox Code Playgroud)

在您的示例中:

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

这将隐藏ts编译器错误.

  • 这是对TS的误用。您应该使用`lib`设置来配置编译器,以反映您的使用方式,而不是故意逃避编译器。 (4认同)