typescript TS枚举中的重复字符串值不会导致编译错误吗?

niknxzdl  于 2023-01-31  发布在  TypeScript
关注(0)|答案(4)|浏览(540)

我在一个TypeScript枚举中有这个:

export enum LMXLockRequestError {
  MaxRetries = 'bad_args',
  BadArgumentsError = 'bad_args',
}

这看起来并没有导致编译错误。它是这样的:

var LMXLockRequestError;
(function (LMXLockRequestError) {
    LMXLockRequestError["MaxRetries"] = "bad_args";
    LMXLockRequestError["BadArgumentsError"] = "bad_args";
})(LMXLockRequestError = exports.LMXLockRequestError || (exports.LMXLockRequestError = {}));

如果我用它来做:

if(v === LMXLockRequestError.MaxRetries){

}

如果v是“bad_args”,则它将同时匹配MaxRetries和BadArgumentsError。
这是应该发生的吗?或者我应该在Github上提交TypeScript的问题?
对我来说,一个枚举应该有不同的键,但也许不一定有不同的值?如果有一种方法告诉枚举它必须有不同的值,那就太好了。

pcww981p

pcww981p1#

关于TS ENUM规范:
枚举允许我们定义一组命名常量。使用枚举可以更容易地记录意图,或创建一组不同的大小写。TypeScript提供数字和基于字符串的枚举。
没有什么关于它应该是uniq的,所以可能这种行为是好的。
enum/typescript

**更新:**关于ENUM和“bug”还有一件有趣的事情:

枚举值递增不考虑以前定义的值,编译器也不会在出现重复值时引发错误。
这意味着您可能会遇到潜在的bug:

enum Color {Red = 3, Green = 2, Blue};

Color.Red == Color.Blue; //true
rm5edbpk

rm5edbpk2#

添加一个您可能会遇到的实际问题(请记住,在运行时使用的是值):

enum Toto {
   A = "a",
   B = "a"
}

const a = Toto.B;
switch (a) {
    case Toto.A:
        console.log("1");
    break;
    case Toto.B:
        console.log("2");
}

没有办法进入case Toto.B case。如果typescript不允许重复的名称,那就方便了。

t98cgbkg

t98cgbkg3#

有一个typescript-eslint rule用于此:no-duplicate-enum-values.

piztneat

piztneat4#

同样的行为也发生在C#中:

void Main() {
    var blue = Color.Blue;
    blue.Dump(); // Red
}

enum Color {
    Red = 3,
    Green = 2,
    Blue 
}

相关问题