在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
文件,但显然情况并非如此。
答案 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文字。使用所有其他解决方案时,也会发生相同的结果:
使用通用方法的解决方案如下:
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) {
...
}
也不会编译,因为在这种情况下,e1
是0
(因为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!")
}