如标题中所述,如何确定Typescript中枚举中的元素数量,例如本例中的
enum ExampleEnum {
element1 = 1,
element2 = 2,
element3 = 3,
element4 = 4,
element5 = 5,
element6 = 6
}
var exampleEnumElementCount:number = ?
如何确定计数?在这种情况下应该是6
答案 0 :(得分:27)
AFAIK,Typescript没有提供获取枚举元素数量的标准方法。但是从its implementation开始,有一种巧妙的方法可以实现它。
Object.keys(ExampleEnum).length / 2
答案 1 :(得分:3)
如果您有一个数字从0
开始的枚举,则可以插入一个占位符作为最后一个元素,如:
enum ERROR {
UNKNOWN = 0,
INVALID_TYPE,
BAD_ADDRESS,
...,
__LENGTH
}
然后,无论您插入多少元素,使用ERROR.__LENGTH
都将是枚举的大小。
对于任意偏移,您可以跟踪它:
enum ERROR {
__START = 7,
INVALID_TYPE,
BAD_ADDRESS,
__LENGTH
}
在这种情况下,有意义的错误将是ERROR.__LENGTH - (ERROR.__START + 1)
答案 2 :(得分:1)
接受的答案不适用于任何附加了值的枚举版本。它仅适用于最基本的枚举。这是适用于所有类型的我的版本:
export function enumElementCount(enumName: any): number {
let count = 0
for(let item in enumName) {
if(isNaN(Number(item))) count++
}
return count
}
这是摩卡咖啡的测试代码:
it('enumElementCounts', function() {
enum IntEnum { one, two }
enum StringEnum { one = 'oneman', two = 'twoman', three = 'threeman' }
enum NumberEnum { lol = 3, mom = 4, kok = 5, pop = 6 }
expect(enumElementCount(IntEnum)).to.equal(2)
expect(enumElementCount(StringEnum)).to.equal(3)
expect(enumElementCount(NumberEnum)).to.equal(4)
})
答案 3 :(得分:1)
要进一步扩展@Esqarrouth的答案,枚举中的每个值都将产生两个键,但字符串枚举值除外。例如,给定TypeScript中的以下枚举:
enum MyEnum {
a = 0,
b = 1.5,
c = "oooo",
d = 2,
e = "baaaabb"
}
编译为Javascript后,您将得到:
var MyEnum;
(function (MyEnum) {
MyEnum[MyEnum["a"] = 0] = "a";
MyEnum[MyEnum["b"] = 1.5] = "b";
MyEnum["c"] = "oooo";
MyEnum[MyEnum["d"] = 2] = "d";
MyEnum["e"] = "baaaabb";
})(MyEnum || (MyEnum = {}));
如您所见,如果我们简单地有一个枚举,其条目为a
,给出的值为0
,那么您将得到两个键。 MyEnum["a"]
和MyEnum[0]
。另一方面,字符串值仅产生一个键,如上面的条目c
和e
所示。
因此,您可以通过确定多少个键不是数字来确定实际计数;即,
var MyEnumCount = Object.keys(MyEnum).map((val, idx) => Number(isNaN(Number(val)))).reduce((a, b) => a + b, 0);
它只是映射所有键,如果键是字符串,则返回1
,否则返回0
,然后使用reduce函数将其添加。
或者,一种更容易理解的方法:
var MyEnumCount = (() => {
let count = 0;
Object.keys(MyEnum).forEach((val, idx) => {
if (Number(isNaN(Number(val)))) {
count++;
}
});
return count;
})();
您可以在TypeScript游乐场https://www.typescriptlang.org/play/
中进行自我测试