Как деструктурировать значения перечисления в машинописном тексте?
У меня есть перечисление в машинописном тексте, как показано ниже:
export enum XMPPElementName {
state = "state",
presence = "presence",
iq = "iq",
unreadCount = "uc",
otherUserUnreadCount = "ouc",
sequenceID = "si",
lastSequenceID = "lsi",
timeStamp = "t",
body = "body",
message = "message"
}
И хочет деструктурировать свое значение, как мы можем сделать это в Typescript?
const { uc, ouc, msg, lsi, si, t, body } = XMPPElementName;
Обновить
Как упоминал@amadan, мы можем использовать
Assigning to new variable names
как в документе Mozilla, скажем, Destructuring_assignment, как показано ниже:
Присваивание новым именам переменных
Свойство можно распаковать из объекта и присвоить переменной с именем, отличным от имени свойства объекта.
const o = {p: 42, q: true};
const {p: foo, q: bar} = o;
console.log(foo); // 42
console.log(bar); // true
И этот метод очень хорош для решения этой проблемы, но если вам нужно получить доступ ко всем элементам без необходимости их явно определять, вы можете использовать любой из этих двух упомянутых tag1 tag2
4 ответа
const { uc, ouc, msg, lsi, si, t, body } = XMPPElementName;
Это не работает, потому что
XMPPElementName
не имеет элемента с именем
uc
(и то же самое для других). Если вы явно укажете свои ключи, он будет работать:
const {
unreadCount: uc,
otherUserUnreadCount: ouc,
message: msg,
lastSequenceID: lsi,
sequenceID: si,
timeStamp: t,
body: body,
} = XMPPElementName;
это сработает. В качестве альтернативы вы можете просто использовать переменные с именами, которые соответствуют ключам, а не значениям:
const {
unreadCount,
otherUserUnreadCount,
message,
lastSequenceID,
sequenceID,
timeStamp,
body,
} = XMPPElementName;
Вам нужна карта значений enum для значений. Как вы уже сказали, enum в JS - это просто POJO. Вы можете создать служебный тип, который поможет сгенерировать правильный тип.
type EnumValueMap<T extends { [k: string]: string }> = { [K in T[keyof T]]: K }
function convertEnumValuesToObject<T extends { [k: string]: string }>(enumerable: T): EnumValueMap<T> {
return (Object as any).fromEntries(Object.values(enumerable).map(v => [v, v]))
}
Как мы знаем, в машинописном тексте перечисление похоже на простой старый объект javascript (по крайней мере, то, что показывает js-вывод игровой площадки или журнал):
один из способов - использовать функцию, которая генерирует новый объект с
{value:value}
структура, как показано ниже:
export function convertEnumValuesToObject<T>(enumObj: T): { [index: string]: T[keyof T] } {
const enum_values = Object.values(enumObj);
return Object.assign({}, ...enum_values.map(_ => ({ [_]: _ })));
}
const { uc, ouc, msg, lsi, si, t, body } = convertEnumValuesToObject(
XMPPElementName
);
Было бы здорово увидеть ответы в машинописном тексте?
Это может быть полезно для тех, кто ищет быстрый и простой ответ - да, вы можете (по крайней мере, на данный момент). Насколько я могу судить, это работает для перечислений с присвоенными значениями и без них.
enum MyEnum {
One,
Two,
Three
}
const { One, Two, Three } = myEnum;
console.log({ One, Two, Three }) // {One: 0, Two: 1, Three: 2}
enum Status {
None = '',
Created = 'CREATED',
Completed = 'COMPLETED',
Failed = 'FAILED',
}
const { None, Created, Completed, Failed } = Status;
console.log(None, Created, Completed, Failed) // '', 'CREATED', 'COMPLETED, 'FAILED'
Пожалуйста, напишите мне, если я ошибаюсь или вы обнаружили какую-то странность при тестировании себя.