Website-Suche

Typescript Enum Object.values() Rückgabewert


Warum geben Object.values() und Object.keys() immer sowohl die Schlüssel als auch die Werte zurück?

Betrachten Sie den folgenden Code:

enum Enum {
    FOO,
    BAR
}

console.log(Object.values(Enum));
console.log(Object.keys(Enum));

Die Ausgabe davon wäre:

[ 'FOO', 'BAR', 0, 1 ]
[ '0', '1', 'FOO', 'BAR' ]

Warum macht es das und wie bekomme ich nur die Schlüssel und Werte?

Antwort #1

So werden enum-Typen von TypeScript transpiliert.

enum Enum {
    FOO,
    BAR
}

wird werden

"use strict";
var Enum;
(function (Enum) {
    Enum[Enum["FOO"] = 0] = "FOO";
    Enum[Enum["BAR"] = 1] = "BAR";
})(Enum || (Enum = {}));

Beachten Sie, dass sowohl numerische Schlüssel als auch Zeichenfolgeschlüssel bereitgestellt werden, um eine einfache Zuordnung zu und von beiden Typen zu ermöglichen, sodass Sie so etwas tun können:

const value = Enum.FOO;  // inferred type Enum.FOO
const key = Enum[value]; // inferred type string

Wenn Sie ein Array nur mit den numerischen oder String-Schlüsseln erhalten möchten, können Sie Folgendes tun:

const numericKeys = Object.keys(Enum).map(x => parseInt(x)).filter(x => !isNaN(x));
const stringKeys = Object.keys(Enum).filter(x => isNaN(parseInt(x)));

Oder für die numerischen oder Zeichenkettenwerte (erfordert die es2017-Bibliothek in Ihrer tsconfig):

const numericValues = Object.values(Enum).filter(x => typeof x === "number");
const stringValues = Object.values(Enum).filter(x => typeof x === "string");

Antwort #2

Werte werden nicht dupliziert, wenn Sie sie stattdessen als KEY=value setzen:

enum MyEnum = {
  FOO = 'foo',
  BAR = 'bar',
}

Object.keys(MyEnum) -> ['FOO', 'BAR']
Object.values(MyEnum) -> ['foo', 'bar']

Live-Beispiel

Abhängig von Ihrer Situation könnte es einfacher sein, Ihre Enums auf dieses Format zu aktualisieren, als Hilfsfunktionen hinzuzufügen, um die Duplikate herauszufiltern.

Verwandte Artikel