确定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类型脚本没有提供获取枚举元素数量的标准方法

正如标题中所说,如何在Typescript中确定枚举中的元素数,如本例所示

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)精确计算,仅计算非数字项。我在此处看到七个
元素,而不是六个。