Ich versuche, eine durch Kommas getrennte Zeichenfolge von einem Objekt zu bilden.
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);
Wie geht das mit TypeScript?
eine Fehlerdatei erhalten:
severity: 'Error'
message: 'Property 'values' does not exist on type 'ObjectConstructor'.'
at: '216,27'
source: 'ts'
typescript
object
user2280016
quelle
quelle
Object.values
in TS verwendet werden, um den Kompilierungsfehler des OP zu beheben . Dazu brauchen Sie einfachES2017
in Ihrer--lib
Einstellung.ES2017
lib hinzufügen und eine Polyfills-Bibliothek einschließen, in der Sie sie verwenden. Geben Sie unterschiedliche Antworten gegen verschiedene Personen.ES7/Object.values()
. Vielleicht denken Sie, dass es komplex ist (ich bin nicht anderer Meinung), aber das ist nur die Natur des Versuchs, zukünftige Funktionen wieObject.values()
heute zu nutzen. Es war schon immer so. SelbstObject.keys()
wenn Sie auf ES3 abzielen oder IE8 unterstützen möchten (hoffentlich nicht mehr!), Sollte es im Allgemeinen eine gute Idee sein, die ES-Funktionen, die Browserunterstützung und das Polyfilling zu verstehen, wenn Sie sich in der Webentwicklung befinden!Object.values()
ist Teil von ES2017 , und der Kompilierungsfehler, den Sie erhalten, liegt darin, dass Sie TS für die Verwendung der ES2017-Bibliothek konfigurieren müssen. Sie verwenden wahrscheinlich die ES6- oder ES5-Bibliothek in Ihrer aktuellen TS-Konfiguration.Lösung: Verwenden Sie
es2017
oderes2017.object
in Ihrer--lib
Compiler-Option .Zum Beispiel mit
tsconfig.json
:Beachten Sie, dass ES2017 mit Typoskript Targeting ist nicht polyfills im Browser für ES2017 emittieren (dh die oben löst Ihre Kompilierung Fehler, aber man kann immer noch auftreten Laufzeitfehler , da der Browser ES2017 nicht implementiert ), dann ist es an Ihnen, Ihr Projekt POLYfill Codieren Sie sich, wenn Sie möchten. Und da ist noch nicht gut von allen Browsern unterstützt (zum Zeitpunkt des Schreibens dieses Artikels) , die Sie auf jeden Fall eine polyfill: wird die Arbeit erledigen .
Object.values
Object.values
core-js
quelle
ES2017
,es2017
aber AFAIK das ist nicht notwendig, aber ich möchte immer lernen, gab es einen Grund für die Änderung?ES2017
,DOM
(Groß-) in dem aufgeführt isttsc --init
Kommentar als die gültigen Werte und es funktioniert einwandfrei in den Compiler, aber das JSON Schema aufzählt nur diees2017
,dom
(klein geschrieben) Optionen, so JSON IDE / Linter Willen FlaggeES2017
,DOM
als ungültige Werte (obwohl sie gültig sind). Ein bisschen verwirrend.tsc --help
zeigt jedoch KleinbuchstabenObject.values()
. Mit anderen Worten, Sie können den Kompilierungsfehler umgehen, aber dennoch auf Laufzeitfehler stoßen, wenn Sie in einem Browser ausgeführt werden, der dies nicht hatObject.values()
.Sie können dies
Object.values
in TypeScript verwenden,(<any>Object).values(data)
wenn Sie aus irgendeinem Grund in tsconfig nicht auf ES7 aktualisieren können.quelle
if for some reason you can't update to ES7 in tsconfig
Anstatt
verwenden
In Ihrem Beispielfall:
Dadurch wird der ts-Compilerfehler ausgeblendet.
quelle
lib
Einstellung konfigurieren, die Ihre Verwendung widerspiegelt, und nicht absichtlich dem Compiler entkommen.lib
Einstellung dient lediglich der korrekten Typprüfung.Ich habe das Ziel in meinem erhöht
tsconfig.json
, um diese Funktion in TypeScript zu aktivierenquelle
Ich habe gerade genau dieses Problem mit Angular 6 mithilfe der CLI und der Arbeitsbereiche festgestellt, mit denen eine Bibliothek erstellt wurde
ng g library foo
.In meinem Fall befand sich das Problem im
tsconfig.lib.json
Ordner "Bibliothek", der nichtes2017
imlib
Abschnitt enthalten war.Wenn Sie mit Angular 6 auf dieses Problem stoßen, müssen Sie nur sicherstellen, dass Sie
tsconfig.lib.json
und Ihre Anwendung aktualisiert werdentsconfig.json
quelle
Wenn meine
tslint
Regelkonfiguration hier immer die ZeileObject["values"](myObject)
durch ersetztObject.values(myObject)
.Zwei Optionen, wenn Sie das gleiche Problem haben:
(Object as any).values(myObject)
oder
quelle
Object["values"]
?Der einfachste Weg ist, das
Object
zu besetzen, wie folgtany
:Und voila - keine Kompilierungsfehler;)
quelle
Noch einfacher ist die Verwendung
_.values
von underscore.js https://underscorejs.org/#valuesquelle