为了进一步扩展@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 所示。
因此,您可以通过确定有多少个Key不是数字来确定实际计数;即,
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/