如何在TypeScript中比较枚举

时间:2016-09-30 06:47:36

标签: typescript enums compare equality

在TypeScript中,我想比较两个包含枚举值的变量。这是我的最小代码示例:

enum E {
  A,
  B
}

let e1: E = E.A
let e2: E = E.B

if (e1 === e2) {
  console.log("equal")
}

使用tsc(v 2.0.3)进行编译时出现以下错误:

  

TS2365:运算符'==='不能应用于类型'E.A'和'E.B'。

==!==!=相同。 我尝试添加const关键字但似乎没有效果。 TypeScript spec说明如下:

  

4.19.3<,>,< =,> =,==,!=,===和!==运算符

     

这些运算符要求一个或两个操作数类型可分配给另一个。结果始终是布尔基元类型。

其中(我认为)解释了错误。但我怎么能绕过它?

旁注
我正在使用带有atom-typescript的Atom编辑器,我的编辑器中没有任何错误/警告。但是当我在同一目录中运行tsc时,我得到上面的错误。我以为他们应该使用相同的tsconfig.json文件,但显然情况并非如此。

9 个答案:

答案 0 :(得分:12)

嗯,我觉得我找到了有用的东西:

if (e1.valueOf() === e2.valueOf()) {
  console.log("equal")
}

但我有点惊讶的是文档中没有提到这一点。

答案 1 :(得分:12)

还有另外一种方法:如果您不希望以任何方式影响生成的JavaScript代码,可以使用类型转换:

let e1: E = E.A
let e2: E = E.B


if (e1 as E === e2 as E) {
  console.log("equal")
}

通常,这是由基于控制流的类型推断引起的。使用当前的打字稿实现,只要涉及函数调用,它就会关闭,所以你也可以这样做:

let id = a => a

let e1: E = id(E.A)
let e2: E = id(E.B)

if (e1 === e2) {
  console.log('equal');
}

奇怪的是,如果声明id函数返回与其文章完全相同的类型,则仍然没有错误:

function id<T>(t: T): T { return t; }

答案 2 :(得分:4)

如果能够将两个枚举与此

进行比较
 if (product.ProductType && 
       (product.ProductType.toString() == ProductTypes[ProductTypes.Merchandises])) {
      // yes this item is of merchandises
  } 

ProductTypes为此export enum ProductTypes{Merchandises,Goods,...}

答案 3 :(得分:2)

对我来说唯一有用的东西(在打字稿2.2.1中)是这样的:

if (E[e1] === E[e2]) {
  console.log("equal")
}

这会比较代表名称的字符串(例如&#34; A&#34;和&#34; B&#34;)。

答案 4 :(得分:1)

我将像这样为Enum定义值并与===

进行比较
const enum AnimalInfo {
Tiger = "Tiger",
Lion = "Lion"
}

let tigerStr = "Tiger";

if (tigerStr === AnimalInfo.Tiger) {
  console.log('true');
} else {
  console.log('false');
}

答案 5 :(得分:0)

在我的情况下,上述解决方案均无效,原因是我将枚举值强制转换为枚举对象。

此后,我试图知道该枚举是否等效于另一个枚举对象...因此,我创建了以下泛型函数:

@RequestMapping

这是我的测试案例的一个示例:

  public static enumEquals<T>(e: any, e1: T, e2: T): boolean {
    const v1 = this.enumValue(e, e1);
    return v1 === this.enumValue(e, e2, typeof v1);
  }

  private static enumValue<T>(enumType: any, value: T, validType?: string) {
    let v = enumType[value];
    if (!validType) {
      return v;
    }
    while (typeof v !== validType) {
      v = enumType[v];
    }
    return v;
  }

很显然,这段代码没有用,在我尝试了此问题的解决方案后,我发现当enumRefKey有效时, console.log(parsedEnum)正在打印数字,并且如果不是,则输入VALUE_DEF文字。使用所有其他解决方案时,也会发生相同的结果:

  • parsedEnum为SomeEnum
  • parsedEnum.valueOf()
  • SomeEnum [parsedEnum]

使用通用方法的解决方案如下:

enum SomeEnum {
  VALUE1, VALUE2, VALUE3, VALUE_DEF
}

const enumRefKey = localStorage.getItem('someKey');
const parsedEnum = SomeEnum[enumRefKey] || SomeEnum.VALUE_DEF;
console.log(parsedEnum);
if (parsedEnum === SomeEnum.VALUE_DEF) {
  // do stuff
}

我希望这对某人有帮助。

答案 6 :(得分:0)

引发该错误是因为编译器意识到该语句始终为false,因此是冗余的。您声明两个显然不相等的变量,然后尝试查看它们是否相等。

如果将其更改为例如:

enum E {
  A,
  B
}

foo() {
  let e1: E = E.A
  let e2: E
  e2 = foo();

  if (e1 === e2) {
    console.log("equal")
  }
}

bar(): E {
  return E.B
}

它应该编译没有错误。

在旁注中,……。像

let e1 = E.A;
if (e1 && e1 === E.B) {
  ...
}

也不会编译,因为在这种情况下,e10(因为A是第一个枚举“选项”),因此false意味着第二个状态永远不会达到(不管第二条语句在这种情况下是否也有效)

答案 7 :(得分:0)

在打字稿中有一个示例枚举:

enum Example {
   type1,
   type2
};

转换为javascript到该对象:

Example {
    '0': 'type1', 'type1': 0,
    '1': 'type2', 'type2': 1
}

我在打字稿中的比较枚举有很多问题。这个简单的脚本解决了这个问题:

enum Example {
    type1 = 'type1',
    type2 = 'type2'
};

然后在javascript中,对象被转换为:

Example {
    'type1': 'type1',
    'type2': 'type2'
}

如果您不需要使用枚举-最好不要使用。 Typescript具有更多高级类型,更多信息请参见: https://www.typescriptlang.org/docs/handbook/advanced-types.html 您可以改用:

type Example = 'type1' | 'type2';

答案 8 :(得分:0)

将枚举类型枚举为字符串是一种非常有价值的技术。

例如;

if (String(e1) === String(e2)) {
    console.log("equal, now actually works!")
}