我使用的是TypeScript,并进行了以下测试Enum
enum Colors {
Red = "RED",
Green = "GREEN",
Blue = "BLUE",
Other = 1
}
注意:此枚举仅用于演示。我实际上并没有混合数字和字符串,但它只是为了表明错误而写两个枚举更容易。
现在,在我的代码中,我想检查枚举中是否有特定值,但是,在检查字符串Enum
时,它始终为假
'RED' in Colors // false
"RED" in Colors // false
'GREEN' in Colors // false
"GREEN" in Colors // false
1 in Colors // true
我查看了编译后的代码,这就是它的外观
var Colors;
(function (Colors) {
Colors["Red"] = "RED";
Colors["Green"] = "GREEN";
Colors["Blue"] = "BLUE";
Colors[Colors["Other"] = 1] = "Other";
})(Colors || (Colors = {}));
生成的整数代码看起来与字符串不同,这是不是很奇怪?
我的TypeScript版本为2.4.1
,根据this blog,它自2.4起可用,所以我应该很高兴,对吧?
我试图在枚举中只使用一个值(字符串/数字),但仍然是相同的错误。 如何检查基于字符串的Enum中是否存在值?
我将代码编译为ES5,但是对于ES6,会出现同样的问题。
答案 0 :(得分:3)
您正按物业价值进行访问,但相反,
in
运算符用于property name
访问。
您的数据如下:
var Colors = {
Red: "RED"
}
因此您可以测试密钥Red
是否在Colors
中:'Red' in Colors // true
如果您需要检查其中一个键是否有“RED”(全部为高)作为值, 然后你需要迭代对象。
var Colors = {
Red: "RED"
}
function valueInColors(needed) {
for(let k in Colors) {
if(Colors.hasOwnProperty(k) && Colors[k] === needed) {
return true;
}
}
return false;
}
console.log(valueInColors('RED'))
好的,你的意思是,当我在Colors中搜索1时,它找不到值为1的元素,而是在生成的数组中找到带有键1的元素?
Colors[Colors["Other"] = 1] = "Other";
// Assignment operator returns the value, so, the previous expression is like:
Colors["Other"] = 1
Colors[1] = "Other";
啊,我明白了。从技术上讲,我甚至不需要这些价值观?我不需要使用“Red:Red,Green:Green”,我可以选择“Red,Green”等?
有时候你需要,有时候没有。在这个特定的情况下,我认为你不需要价值观。您可以在此处找到更多信息:https://www.typescriptlang.org/docs/handbook/enums.html