确定枚举元素TypeScript的数量

时间:2016-06-26 02:17:41

标签: typescript enums

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

enum ExampleEnum {

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

}

var exampleEnumElementCount:number = ? 

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

4 个答案:

答案 0 :(得分:27)

警告:它不适用于string enum

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]。另一方面,字符串值仅产生一个键,如上面的条目ce所示。

因此,您可以通过确定多少个键不是数字来确定实际计数;即,

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/

中进行自我测试