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

时间:2018-07-04 09:32:11

标签: typescript typescript-typings tsc

我在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提交问题?

对我来说,枚举应具有不同的键,但不一定必须具有不同的值?如果有一种方法可以告诉枚举它必须具有不同的值,那就太好了。

3 个答案:

答案 0 :(得分:3)

关于TS ENUM规范:

  

枚举允许我们定义一组命名常量。使用枚举可以更轻松地记录意图或创建一组不同的案例。 TypeScript提供数字和基于字符串的枚举。

它没有什么应该是唯一的,所以behaivor可能是好主意。

enum/typescript

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

  

枚举值递增不会考虑以前定义的值,编译器也不会在重复值上引发错误。

     

这意味着您可能会遇到潜在的错误:

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

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

答案 1 :(得分:0)

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

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");
}

没有办法进入Toto.B案件。如果打字稿不允许重复的名称,那将很方便。

答案 2 :(得分:0)

在c#中也会发生相同的行为:

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

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