确定枚举元素TypeScript的数量

The*_*der 21 enums typescript

如标题中所述,如何确定Typescript中枚举中的元素数量,例如本例中的元素数量

enum ExampleEnum {

    element1 = 1,
    element2 = 2,
    element3 = 3,
    element4 = 4,
    element5 = 5,
    element6 = 6

}

var exampleEnumElementCount:number = ? 
Run Code Online (Sandbox Code Playgroud)

如何确定计数?在这种情况下它应该是6

Zen*_*Zen 31

警告:它不适用于字符串枚举.

AFAIK,Typescript没有提供获取枚举元素数量的标准方法.但是从它的实现来看,有一种巧妙的方法可以做到.

Object.keys(ExampleEnum).length / 2
Run Code Online (Sandbox Code Playgroud)

  • 你没有阅读它的实现.对吗?@ElDude (7认同)
  • 这个答案很危险.字符串枚举将失败. (5认同)
  • 为什么除以2? (3认同)
  • @IlkerCat在TypeScript v3中,该问题没有任何变化-数字枚举仍然具有两倍的键,因为它们得到了反向映射,而字符串枚举没有得到反向映射,因此您无需除以二。运行时实现中的这种差异始终存在并且仍然存在。请注意,您也可以混合使用枚举。在这种情况下,枚举成员的数量介于一半和全长之间,可以使用Object.keys(ExampleEnum).filter(isNaN).length(您也可以在此处使用Object.values)进行精确计算,仅计算非-数字项。 (3认同)
  • 这个答案不再正确。到目前为止,不需要将Object.keys(ExampleEnum)/ 2除以2。使用Typescript v3,甚至可以很好地支持字符串,就像数字一样。@MarkusEnde (2认同)

ste*_*ert 22

如果您有一个从 开始计数的枚举0,您可以插入一个占位符作为大小的占位符作为最后一个元素,如下所示:

enum ERROR {
  UNKNOWN = 0,
  INVALID_TYPE,
  BAD_ADDRESS,
  ...,
  __LENGTH
}
Run Code Online (Sandbox Code Playgroud)

然后使用ERROR.__LENGTH将是枚举的大小,无论您插入多少个元素。

对于任意偏移量,您可以跟踪它:

enum ERROR {
  __START = 7,
  INVALID_TYPE,
  BAD_ADDRESS,
  __LENGTH
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,有意义的错误数量将是 ERROR.__LENGTH - (ERROR.__START + 1)


Esq*_*uth 7

接受的答案不适用于任何附加值的枚举版本。它仅适用于最基本的枚举。这是我的适用于所有类型的版本:

export function enumElementCount(enumName: any): number {
    let count = 0
    for(let item in enumName) {
        if(isNaN(Number(item))) count++
    }
    return count
}
Run Code Online (Sandbox Code Playgroud)

这是摩卡的测试代码:

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)
})
Run Code Online (Sandbox Code Playgroud)