我有一个枚举
export enums Actions {
All = 1,
Success = 2,
Failed = 3
}
当我使用 for 循环迭代它时,我总共得到 6 个条目。我了解到这就是 Typescript 中的工作原理。但是我如何使用枚举以便我可以访问
enum.key
“全部、成功、失败”和
enum.value
1,2,3
根据 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);
为了像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
。for (const keyString in Actions) {
const key = Number(keyString);
if (isNaN(key)) { continue; }
console.log(key);
}
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
等来做到这一点。但是从你的问题来看,我认为我的示例应该可以解决问题。/** 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}`);
});