【问题标题】:How to de-structure an enum values in typescript?如何在打字稿中解构枚举值?
【发布时间】:2021-02-09 09:04:02
【问题描述】:

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

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 mentioned,我们可以使用Assigning to new variable names,如Mozilla doc中的Destructuring_assignment,如下所示:

分配给新的变量名

可以从对象中解压缩属性并将其分配给名称与对象属性不同的变量。

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

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

【问题讨论】:

    标签: javascript typescript object enums destructure


    【解决方案1】:

    我们知道,在 typescript 中,枚举就像一个普通的旧 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
        ); 
    

    很高兴看到打字稿中的答案?

    【讨论】:

    • typescript 版本添加,看我的回答。
    【解决方案2】:

    您需要一个枚举值到值映射。就像你所说的 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

    【讨论】:

      【解决方案3】:
      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-08-03
        • 2020-04-30
        • 1970-01-01
        • 2020-12-07
        • 2020-01-29
        • 2019-09-26
        • 2020-01-17
        相关资源
        最近更新 更多