TypeScript中枚举器输出异常问题

4

有谁能够解释下面代码的输出结果吗?

enum days { sun = 1, mon = 0, tues };

console.log(days[1]); // 返回 tues // 预期输出 -- mon
console.log(days[0]); // 返回 mon // 预期输出 -- sun

此外,请解释一下我怎样才能在这个示例中打印出 sun?这个情况让我感到困惑。请您在执行代码并观察输出结果后,再提供有效的解释。

2个回答

2
这是typescript:
enum days { sun = 1, mon = 0, tues };

TypeScript 可以编译成以下 JavaScript 代码:

var days;
(function (days) {
    days[days["sun"] = 1] = "sun";
    days[days["mon"] = 0] = "mon";
    days[days["tues"] = 1] = "tues";
})(days || (days = {}));
;

这段代码涉及到it技术,具体翻译如下:

第一部分:days[days["sun"] = 1] = "sun";

首先执行days["sun"] = 1,它会确保你可以调用days.sun并获得值1,并返回键"sun"的值=>1。这意味着最初days[1]将被设置为"sun"。

第二部分:days[days["mon"] = 0] = "mon";

确保你可以调用days.mon并获得值0,并返回键"mon"的值=>0。所以days[0]将被设置为"mon"。

然而,第三部分:days[days["tues"] = 1] = "tues";

执行days["tues"] = 1,确保你可以调用days.tues并获得值1,并返回键"tues"的值=>1。这意味着此时days[1]将被覆盖为"value=tues"。


这确实回答了我大部分的问题..但我也想知道是否有一种方法可以在这里获得Sun印刷。 - Mark
如果你给tues提供一个唯一的值(2),或者只是删除所有的值,那么你就可以通过days[days.sun]打印出sun - Philip Bijker
是的,没问题。只要我不更改当前代码,这是可能的吗?或者像你指出的那样,该值已被覆盖? - Mark
sun 不再存在了。它被 tues 覆盖了。只有键 sun 仍然存在。 - Philip Bijker

-1

你构建枚举的方式很不寻常。 根据文档,未定义的枚举将通过将上一个值加1来自动创建一个值。

你当前的枚举结构将有两个值设置为1。TypeScript/JavaScript似乎会选择具有所需值的最后一项。

你的代码:

enum days{
sun = 1,
mon = 0,
tues
}

VS(来自我的一个正常工作项目的相似枚举)

enum days{
Sun = 0,
Mon,
Tue,
Wed,
Thu,
Fri,
Sat
}

根据文档(https://www.typescriptlang.org/docs/handbook/enums.html

如果枚举成员没有初始化器并且前一个枚举成员是常数,则当前枚举成员的值将是前一个枚举成员的值加一。这种情况下的一个例外是枚举的第一个元素。如果它没有初始化器,则其值为0。


我们可以在枚举中赋予我们想要的值。请专注于回答为什么行为不如预期的问题? - Mark
我不是在寻找猜测或显而易见的答案。即使我知道什么是枚举!这不是一个简单的问题。请认真思考一下。至少想想如何打印太阳。把它当作一个挑战吧!! - Mark
@HiteshSikka 不可能...你复制的值是如何使用的。你必须重新编写枚举如何工作/转换为js才能使它按照你想要的方式工作。如果你需要sun=0,mon=1,tue=0(奇怪的用例),最好使用具有预设const值的类而不是枚举。使用普通的js,然后你可以将属性的名称作为字符串获取(或使用map/dictionary)。 - Roland
我有一个简单的问题 -- 如何在这种情况下打印太阳.. 就这样!! 直到你有答案,不需要毫无意义地发表评论。 - Mark
让我们在聊天中继续这个讨论 - Mark
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接