如何在打字稿中迭代字符串和数字混合枚举?

时间:2018-09-05 03:27:36

标签: typescript

enum MixedEnum {
  A = 1,
  B = 'b',
  C = 'B',
  D = '2'
}

上面的代码是字符串和数字混合的枚举。我想迭代MixedEnum的值。例如,[1, 'b', 'B', '2']或键['A', 'B', 'C', 'D']。有简单的方法吗?

1 个答案:

答案 0 :(得分:0)

为什么要使用混合枚举??我什至不知道那是不允许的!

您可能已经知道,数值型枚举成员将其键名和值都保存在MixedEnum对象上,而字符串型成员只保存了其键名。因此,您可以通过过滤掉MixedEnum的数字成员来迭代键。我们可以从TypeScript checker的检查中找到禁止进行过滤的精确方法,该检查禁止使用数字命名的成员:

if (isNumericLiteralName(text) && !isInfinityOrNaNString(text)) {
    error(member.name, Diagnostics.An_enum_member_cannot_have_a_numeric_name);
}

其中:

function isNumericLiteralName(name: string | __String) {
    // [comments omitted]
    return (+name).toString() === name;
}

因此迭代代码为:

for (let item in MixedEnum) { 
  if ((+item).toString() === item && 0 * (+item) === 0) continue;
  // item is a key, MixedEnum[item] is its value; process
}