如何在打字稿中解构枚举值?

How to de-structure an enum values in typescript?

我在打字稿中有一个枚举,如下所示:

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 , we can use Assigning to new variable names as in Mozilla doc say ,如下所示:

正在分配给新的变量名

A 属性 可以从对象中解包并分配给名称与对象 属性 不同的变量。

const o = {p: 42, q: true};
const {p: foo, q: bar} = o;
 
console.log(foo); // 42 
console.log(bar); // true

并且该方法很好地解决了这个问题,但是如果您需要访问所有项目而不需要显式定义它们,您可以选择这两个中的任何一个

我们知道,在打字稿中,枚举就像一个普通的旧 javascript 对象(at-least 操场 js-output 正在显示或日志显示的内容):

一种方法是使用生成具有如下 {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
    ); 

如果能在打字稿中看到答案就好了?

您需要枚举 value-to-value 地图。就像你说的 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]))
}

Playground Link

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 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'

如果我错了或者您在测试自己时发现任何奇怪的地方,请给我回信。