Typescript Enum Object.values ​​() возвращаемое значение - PullRequest
0 голосов
/ 08 мая 2019

Почему Object.values() и Object.keys() всегда дают и ключи, и значения?

Рассмотрим следующий код:

enum Enum {
    FOO,
    BAR
}

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

Вывод этого будет:

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

Почему это происходит, и как мне получить только ключи и значения?

1 Ответ

3 голосов
/ 08 мая 2019

Вот как enum типы передаются с помощью TypeScript.

enum Enum {
    FOO,
    BAR
}

станет

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

Обратите внимание, что как цифровые, так и строковые ключи предназначены для простого сопоставления с обоими типами и с ними, что позволяет вам сделать что-то вроде этого:

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

Если вы хотите получить массив только числовых или строковых ключей, вы можете сделать это:

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

Или для числовых или строковых значений (требуется библиотека es2017 в вашем tsconfig):

const numericValues = Object.values(Enum).filter(x => typeof x === "number");
const stringValues = Object.values(Enum).filter(x => typeof x === "string");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...