如何在Typescript中以integer为值迭代枚举?

cngwdvgl  于 2023-04-13  发布在  TypeScript
关注(0)|答案(5)|浏览(171)

我有一个枚举

export enums Actions {
All = 1,
Success = 2,
Failed = 3
}

当我使用for循环遍历它时,我得到了总共6个条目。我知道这就是它在Typescript中的工作方式。但是我如何使用枚举以便我可以访问

enum.key

代表“所有、成功、失败”和

enum.value

1、2、3

cmssoen2

cmssoen21#

根据typescript的文档,如果as const关键字足够,那么我们不需要使用枚举。
只是解释,在这种情况下,可能可以使用如图所示的实现,使用Object.keys(obj)Object.values(obj)来获得所需的输出

const Actions = {
  All: 0,
  Success: 1,
  Failure: 2
} as const

let keyArr = Object.keys(Actions);
let valArr = Object.values(Actions);
gev0vcfq

gev0vcfq2#

为了访问枚举keysvalues,你可以像OP中描述的那样,将枚举 * 转换 * 为具有属性keysvalues以及相应数据的基本对象。

export enum Actions {
  All = 1,
  Success = 2,
  Failed = 3
}

export type ConvertedActions = {
  keys: string[];
  values: Actions[];
};

const result = Object.values(Actions).reduce(
  (acc, curr): ConvertedActions =>
    isNaN(+curr)
      ? {...acc, keys: [...acc.keys, curr as string]}
      : {...acc, values: [...acc.values, curr as Actions]},
  <ConvertedActions>{keys: [], values: []}
);

console.log(result.keys);    // [ 'All', 'Success', 'Failed' ]
console.log(result.values);  // [ 1, 2, 3 ]

注意:不要被我定义的额外类型(ConvertedActions)搞糊涂了,但是,为了避免大量使用any,它是必需的。

bqf10yzr

bqf10yzr3#

const keys = Object.keys(Actions);
const values = Object.values(Actions);
ttcibm8c

ttcibm8c4#

在这种特定情况下,您可以将All, Success, Falied1, 2, 3分隔为两个不同的数组。

export enums Actions {
    All = 1,
    Success = 2,
    Failed = 3
}
console.log(Object.keys(enums).filter((v) => isNaN(Number(v)))); // ["All", "Success", "Failed"] 
console.log(Object.keys(enums).filter((v) => !isNaN(Number(v)))); // ["1", "2", "3"]

你也可以用for..in循环来实现:

for (const value in enums) {
  console.log(value); // 1, 2, 3, All, Success, Falied
  console.log(value.filter((v) => isNaN(Number(v)))); // All, Success, Falied
  console.log(value.filter((v) => !isNaN(Number(v)))); // 1, 2, 3
}

有更多的方法可以使用forEachfor..of等,但从你的问题,我认为我的例子应该做的伎俩。

lnlaulya

lnlaulya5#

这是我的想法,我认为这是最直观的

for (const keyString in Actions) {
    const key = Number(keyString);
    if (isNaN(key)) { continue; }
    console.log(key);
}

相关问题