如何在 Typescript 中迭代以整数作为值的枚举?

问题描述 投票:0回答:6

我有一个枚举

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

当我使用 for 循环迭代它时,我总共得到 6 个条目。我了解到这就是 Typescript 中的工作原理。但是我如何使用枚举以便我可以访问

enum.key 

“全部、成功、失败”和

enum.value 

1,2,3

javascript arrays angular typescript enums
6个回答
2
投票

根据 typescript 的 docs,如果

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);

2
投票

为了像OP中描述的那样访问枚举

keys
values
,你可以做的就是将枚举转换为具有属性keys
values
以及相应数据的基本对象。
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
    


1
投票


1
投票

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



0
投票
All, Success, Falied

1, 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
}

还有更多方法可以使用 
forEach

for..of
等来做到这一点。但是从你的问题来看,我认为我的示例应该可以解决问题。
    


0
投票

/** Type that accept enumerations. */ type Enum = { [k: string]: (number | string) }; type EnumIteratorCallback<T> = (value: T, key?: string) => void; function enumIterator<T>(e: Enum, callback: EnumIteratorCallback<T>): void { const keys = Object.keys(e).filter(k => isNaN(Number(k))); for (const key of keys) { callback(e[key] as T, key); } }

这样回调就可以准确接收枚举类型。
key

参数是可选的。

使用示例:

enum NumericEnum { Zero, One, Two, } enum StringsEnum { First = "first", Second = "second", Third = "third", } enum MixedEnum { First = 1, Second = "second", Third = 3, } console.log("NumericEnum:"); enumIterator<NumericEnum>(NumericEnum, (value: NumericEnum, key?: string): void => { console.log(`${key} -> ${value}`); }); console.log("StringsEnum:"); enumIterator<StringsEnum>(StringsEnum, (value: StringsEnum, key?: string): void => { console.log(`${key} -> ${value}`); }); console.log("MixedEnum:"); enumIterator<MixedEnum>(MixedEnum, (value: MixedEnum, key?: string): void => { console.log(`${key} -> ${value}`); });

游乐场示例

© www.soinside.com 2019 - 2024. All rights reserved.