"在"使用String枚举

时间:2017-06-29 10:50:14

标签: javascript typescript enums

我使用的是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,会出现同样的问题。

1 个答案:

答案 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