J'essaye 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'
typescript
object
user2280016
la source
la source
Object.values
dans TS pour résoudre l'erreur de compilation de l'OP. Pour ce faire, vous avez simplement besoinES2017
dans votre--lib
cadre.ES2017
lib et inclure la bibliothèque polyfills là où l'utiliser.ES7/Object.values()
. Peut-être pensez-vous que c'est complexe (je ne suis pas en désaccord), mais c'est juste la nature d'essayer d'utiliser des fonctionnalités futures commeObject.values()
aujourd'hui. Ça a toujours été comme ça. MêmeObject.keys()
si vous ciblez ES3 ou si vous souhaitez prendre en charge IE8 (j'espère que vous ne le faites plus!), Il est généralement recommandé de comprendre les fonctionnalités ES, la prise en charge du navigateur et le polyfilling si vous êtes en développement Web!Object.values()
fait partie de ES2017 , et l'erreur de compilation que vous obtenez est 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
oues2017.object
dans votre--lib
option de compilation .Par exemple, en utilisant
tsconfig.json
:Notez que le ciblage de ES2017 avec TypeScript n'émet pas de polyfills dans le navigateur pour ES2017 (ce qui signifie que ce qui précède résout votre erreur de compilation , mais vous pouvez toujours rencontrer une erreur d' exécution car le navigateur n'implémente pas ES2017
Object.values
), c'est à vous de polyfill votre projet code vous-même si vous le souhaitez. Et comme ilObject.values
n'est pas encore bien pris en charge par tous les navigateurs (au moment d'écrire ces lignes), vous voulez vraiment un polyfill:core-js
fera le travail .la source
ES2017
enes2017
mais AFAIK ce n'est pas nécessaire, mais je veux toujours apprendre, y avait-il une raison pour le changement?ES2017
,DOM
(majuscule) est indiqué dans letsc --init
commentaire que les valeurs valides et il fonctionne correctement dans le compilateur, mais le schéma JSON énumère uniquement leses2017
,dom
options (minuscules), de sorte JSON IDE / linter signalerontES2017
,DOM
comme une valeur invalide (même si elles sont valides). Un peu déroutant.tsc --help
affiche cependant des minusculesObject.values()
. En d'autres termes, vous pouvez contourner l'erreur de compilation mais toujours rencontrer des erreurs d'exécution si vous exécutez dans un navigateur qui n'a pasObject.values()
.Vous pouvez utiliser
Object.values
dans TypeScript en faisant cela(<any>Object).values(data)
si, pour une raison quelconque, vous ne pouvez pas mettre à jour vers ES7 dans tsconfig.la source
if for some reason you can't update to ES7 in tsconfig
Au lieu de
utilisation
Dans votre exemple de cas:
Cela masquera l'erreur du compilateur ts.
la source
lib
paramètre pour refléter la façon dont vous l'utilisez, sans échapper intentionnellement au compilateur.lib
paramètre est juste pour obtenir la vérification de type correcte.J'ai augmenté la cible dans mon
tsconfig.json
pour activer cette fonctionnalité dans TypeScriptla source
Je viens de frapper ce problème exact avec Angular 6 en utilisant la CLI et les espaces de travail pour créer une bibliothèque en utilisant
ng g library foo
.Dans mon cas, le problème se trouvait dans le
tsconfig.lib.json
dossier de la bibliothèque qui ne figurait pases2017
dans lalib
section.Quiconque tombe sur ce problème avec Angular 6, il vous suffit de vous assurer que vous vous mettez à jour
tsconfig.lib.json
ainsi que votre application.tsconfig.json
la source
Avoir ma
tslint
configuration de règles ici en remplaçant toujours la ligneObject["values"](myObject)
parObject.values(myObject)
.Deux options si vous rencontrez le même problème:
(Object as any).values(myObject)
ou
la source
Object["values"]
?Le moyen le plus simple est de lancer le
Object
versany
, comme ceci:Et voila - pas d'erreurs de compilation;)
la source
Encore plus simple, utilisez le
_.values
fichier underscore.js https://underscorejs.org/#valuesla source