【问题标题】:Anomaly in output from enumerators in typescript打字稿中枚举器的输出异常
【发布时间】:2017-07-07 05:16:18
【问题描述】:

谁能解释我从下面的代码中得到的输出?

枚举天数 { sun = 1, mon = 0, tues };

console.log(天[1]); // 周二返回 // 预期输出 -- mon
控制台.log(天[0]); // 返回 mon // 预期输出 -- sun

另外,请解释一下在这种情况下我怎样才能打印太阳?这个场景让我莫名其妙。请大家在执行完代码并观察输出后提供有效的解释。

【问题讨论】:

    标签: typescript enums


    【解决方案1】:

    这个打字稿:

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

    compiles 到这个 javascript:

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

    此第一部分: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] 将被值“tues”覆盖

    【讨论】:

    • 这肯定回答了我的大部分问题.. 但我也想知道是否有办法让我在这里晒太阳
    • 如果您为tues 提供一个唯一值 (2) 或者只是删除所有值,那么您可以将sun 与days[days.sun] 一起打印
    • 是的,这很好。如果我没有对当前代码进行更改,是否有可能或者您指出的值已被覆盖?
    • 值sun 不再存在。它被tues 覆盖。只有关键的太阳仍然存在。
    【解决方案2】:

    您构建枚举的方式不同寻常。 根据文档,未定义的枚举将自动为自己创建一个值,对前一个值 +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)

    它没有初始化器并且前面的枚举成员是 持续的。在这种情况下,当前枚举成员的值将是 前一个枚举成员的值加一。一个例外 rule 是枚举的第一个元素。如果它没有初始化器 它被赋值为 0

    【讨论】:

    • 我们可以在枚举中给出我们想要的值。请坚持为什么行为不符合预期的问题?
    • @HiteshSikka 因为你声明它的方式没有意义。您说 index0 处的值为 eq 1,那么 index1 处的值为 0。这意味着 index2(星期二)的值也将为 1。以这种方式创建的枚举会根据最后一个值自动创建值。根据文档:typescriptlang.org/docs/handbook/enums.html ... 在这种情况下,当前枚举成员的值将是前一个枚举成员的值加一 ...
    • @HiteshSikka 目前您的枚举有两个值 1。看起来 typescript/js 在获取枚举时默认值的最后一个实例(这是我的猜测)
    • 我不是在寻找猜测或显而易见的东西。即使我知道枚举是什么!这不是一个简单的问题。请考虑一下。至少想想太阳是如何被打印出来的。把它当作一个挑战!
    • @HiteshSikka 不可能...您复制的值是您使用它的方式。您必须重新编写枚举的工作方式/翻译成 js 以使其以您想要的方式工作。如果您需要 sun=0, mon=1, tue=0(奇怪的用例),您最好的选择是使用具有预设 const 值的类而不是枚举。使用普通 js,您可以将属性名称作为字符串(或使用地图/字典)
    猜你喜欢
    • 2017-03-06
    • 2020-02-13
    • 2017-06-20
    • 2020-04-30
    • 2020-01-29
    • 2017-05-09
    • 1970-01-01
    • 2017-06-08
    • 2020-10-27
    相关资源
    最近更新 更多