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'
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);
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 .
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.
J'ai augmenté la cible dans mon tsconfig.json
pour activer cette fonctionnalité dans TypeScript
{
"compilerOptions": {
"target": "es2017",
......
}
}
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.
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
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)`