将枚举与另一种枚举进行比较

时间:2019-07-03 09:35:52

标签: typescript enums

我的枚举值相同但名称不同:

enum EnumA{
  HELLO,
  WORLD
}
enum EnumB{
  HELLO,
  WORLD
}

由于它们是由外部来源生成的漫游器,因此它们具有相同的值,但是用于可能是EnumA或EnumB的组件中。

let x: EnumA | EnumB = EnumA.HELLO;
// or
let x: EnumA | EnumB = EnumB.HELLO;

如果我想检查HELLO,我需要

if(x === EnumA.HELLO || x === EnumB.HELLO)

是否有更简单的方法来执行此检查或告诉打字稿这两个枚举是相同的?

类似的东西:

const x: EnumA | EnumB = EnumB.HELLO;

if(x === EnumA.HELLO) {
    console.log('they are the same')
}

如果我尝试此操作,则会收到打字稿警告:

  

由于类型不同,此条件将始终返回“ false”   “ EnumB.HELLO”和“ EnumA.HELLO”没有重叠。

但是console.log被调用了!演示:https://www.typescriptlang.org/play/#code/KYOwrgtgBAouEEEDeBYAUFTUASMAyeA8gDTpZQDqhASngCLoC+6oks8AQqhlrgSWSxVaDNMzToAxgHsQAZwAuUAB4AudpARQAPhogcoAXj0cAdHyIBudOgCWAMwAUyo4eNxN5-EQCUUbuQy8tIANsCmIdIA5o4A5AoAFsAAnlAAhgBOwFCJ2XJpEMCxPkxAA

2 个答案:

答案 0 :(得分:1)

好的,这

const x: EnumA | EnumB = EnumB.HELLO;

if(x === EnumA.HELLO) {
    console.log('they are the same')
}

由于您正在比较常量EnumB.HELLO而ts可以看到此错误。

如果您从这样的函数中获取值

const a = (): EnumA | EnumB => {
  return EnumA.HELLO;
};
const x: EnumA | EnumB = a();

if (x === EnumB.HELLO) {
  console.log('they are the same');
}

是正确的,因为该数字相同,运行时将通过条件

另一种解决方案是将其与数字进行比较。

const x: number = EnumA.HELLO;

if (x === EnumB.HELLO) {
  console.log('they are the same');
}

再次运行时将通过条件,因为这是相同的数字...

答案 1 :(得分:1)

联合类型变量为narrowed by control-flow analysis upon assignment。那就是那行

const x: EnumA | EnumB = EnumA.HELLO;

最终缩小了x的类型,一直缩小到EnumA.HELLO的类型,并且比较两个不相关的类型,例如EnumA.HELLOEnumB.HELLO被认为是错误的。 / p>

如果要防止这种情况发生,以便可以将xEnumAEnumB进行比较,则可以使用type assertion,如下所示:

const x = EnumB.HELLO as EnumA | EnumB;

然后进行比较:

if (x === EnumA.HELLO) { } // okay

Link to code


但是,如果EnumAEnumB都是由外部来源生成的,并且您知道它们将是相同的,那么让它们首先以不同的类型出现似乎让人头疼。我对您的代码不太了解,无法建议如何解决...仅导入EnumA而忽略EnumB?将EnumAEnumB合并为一个对象,并且仅引用合并的EnumAB?不确定。


无论如何,希望能有所帮助。祝你好运!