web-dev-qa-db-fra.com

Comment utiliser Object.values ​​avec typescript?

J'essaie de former une chaîne séparée par des virgules d'un objet,

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);

Comment faire cela avec TypeScript?

obtenir un fichier d'erreur:

severity: 'Error'
message: 'Property 'values' does not exist on type 'ObjectConstructor'.'
at: '216,27'
source: 'ts'
110
user2280016

en utilisant Object.keys à la place.

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

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

const commaJoinedValues = values.join(",");
console.log(commaJoinedValues);
81
holi-java

Object.values() est élément de ES2017 , et l'erreur de compilation que vous obtenez est due au fait que vous devez configurer TS pour utiliser la bibliothèque ES2017. Vous utilisez probablement la bibliothèque ES6 ou ES5 dans votre configuration TS actuelle.

Solution: utilisez _es2017_ ou _es2017.object_ dans votre _--lib_ option du compilateur .

Par exemple, en utilisant _tsconfig.json_:

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

Notez que le ciblage de ES2017 avec TypeScript [n'émet des polyfill dans le navigateur pour ES2017 n'entraîne pas ] == (ce qui signifie que le précédent résout votre compile erreur, mais vous pouvez toujours rencontrer une erreur runtime parce que le navigateur ne met pas en oeuvre ES2017 _Object.values_), il vous appartient de polyfiler votre code de projet vous-même si vous le souhaitez. Et puisque _Object.values_ n’est pas encore bien supporté par tous les navigateurs (au moment de la rédaction de cet article), vous voulez absolument un polyfill: core-js va - faire le travail .

184
Aaron Beall

Vous pouvez utiliser Object.values dans TypeScript en procédant ainsi (<any>Object).values(data) si, pour une raison quelconque, vous ne pouvez pas mettre à jour vers ES7 dans tsconfig.

13
mtpultz

J'ai augmenté la cible dans mon tsconfig.json pour activer cette fonctionnalité dans TypeScript

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

Au lieu de

Object.values(myObject);

utilisation

Object["values"](myObject);

Dans votre cas d'exemple:

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

Cela cachera l'erreur du compilateur ts.

12
Kian

Je viens de frapper ce problème exact avec Angular 6 à l'aide de la CLI et des espaces de travail pour créer une bibliothèque à l'aide de ng g library foo.

Dans mon cas, le problème se trouvait dans le tsconfig.lib.json du dossier de la bibliothèque dans lequel es2017 n'était pas inclus dans la section lib.

Si vous tombez sur ce problème avec Angular 6, il vous suffit de vous assurer que vous mettez à jour votre tsconfig.lib.json ainsi que votre application tsconfig.json

4
Neil Stevens

Ayant ma configuration de règles tslint ici, remplacez toujours la ligne Object["values"](myObject) par Object.values(myObject).

Deux options si vous avez le même problème:

(Object as any).values(myObject)

ou

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