确定TypeScript中枚举元素的数量
正如标题中所说,如何在Typescript中确定枚举中的元素数,如本例所示确定TypeScript中枚举元素的数量,typescript,enums,Typescript,Enums,正如标题中所说,如何在Typescript中确定枚举中的元素数,如本例所示 enum ExampleEnum { element1 = 1, element2 = 2, element3 = 3, element4 = 4, element5 = 5, element6 = 6 } var exampleEnumElementCount:number = ? 如何确定计数?在这种情况下,它应该是6类型脚本没有提供获取枚举元素数量的标准方法
enum ExampleEnum {
element1 = 1,
element2 = 2,
element3 = 3,
element4 = 4,
element5 = 5,
element6 = 6
}
var exampleEnumElementCount:number = ?
如何确定计数?在这种情况下,它应该是6类型脚本没有提供获取枚举元素数量的标准方法。但考虑到以下工作的重要性:
Object.keys(ExampleEnum).length / 2
注意,对于用户,请勿将其除以零,因为不会生成反向映射属性:
Object.keys(StringEnum).length;
具有混合字符串和数值的枚举可以通过以下方式计算:
Object.keys(ExampleEnum).filter(isNaN).length
接受的答案在任何附加了值的枚举版本中都不起作用。它只适用于最基本的枚举。以下是我的版本,适用于所有类型:
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)
})
为了进一步扩展@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 = {}));
正如您所看到的,如果我们只是有一个enum,其条目为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操场上自己测试如果您有一个枚举,其中的数字从
0开始计数,您可以插入一个占位符作为最后一个元素,如下所示:
enum错误{
未知=0,
无效的_类型,
地址不正确,
...,
__长度
}
然后使用ERROR.\u LENGTH
将是枚举的大小,无论插入多少个元素
对于任意偏移,可以跟踪它:
enum错误{
__开始=7,
无效的_类型,
地址不正确,
__长度
}
在这种情况下,有意义的错误量将是ERROR.\uu LENGTH-(ERROR.\uu START+1)
为什么要除以2?这个答案很危险。字符串枚举将失败。此答案不再正确<代码>对象。键(ExampleEnum)/2
现在不需要除以2。Typescript v3支持偶数字符串,与数字完全相同@MarkusEnde@IlkerCat关于TypeScript v3中的这个问题,没有任何变化-带有数字的枚举仍然有两倍多的键,因为它们得到了反向映射,而字符串枚举没有得到反向映射,所以不需要除以2。运行时实现中的这种差异一直存在,并且仍然存在。请注意,您也可以使用混合枚举。在这种情况下,枚举成员的数量介于一半和全长之间,可以使用Object.keys(ExampleEnum).filter(isNaN).length(您也可以在此处使用Object.values)精确计算,仅计算非数字项。我在此处看到七个元素,而不是六个。