1 Вопрос: Typescript Enum Object.values ​​() возвращаемое значение

вопрос создан в Wed, May 8, 2019 12:00 AM

Почему 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' ]

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

    
0
  1. Дополнительная информация о перечислениях: stackoverflow.com/questions/28818849/… . Как получить ключи /значения: github.com/Microsoft/TypeScript/issues/…
    2019-05-08 16: 27: 35Z
1 ответ                              1                         

Вот так 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");
    
3
2019-05-08 16: 26: 41Z
  1. Хорошо, большое спасибо. Есть ли способ получить значения только тогда? Я полагаю, что было бы возможно получить этот результат с помощью Array.splice (), но я не уверен, что порядок всегда одинаков (хотя кажется, что так).
    2019-05-08 16: 14: 16Z
  2. const values = Object.values(Enum).filter(v => typeof v === 'number');
    2019-05-08 16: 15: 45Z
  3. @ Lehks Смотрите мой обновленный ответ.
    2019-05-08 16: 21: 04Z
источник размещен Вот