【问题标题】:Creating TypeScript enum with display value使用显示值创建 TypeScript 枚举
【发布时间】:2016-05-13 11:21:32
【问题描述】:

我有一个如下所示的打字稿枚举:

enum State {
    NotRequired,
    Working,
    PendingReview,
    Reviewed,
    Done
}

这会产生这个:

var State;
(function (State) {
    State[State["NotRequired"] = 0] = "NotRequired";
    State[State["Working"] = 1] = "Working";
    State[State["PendingReview"] = 2] = "PendingReview";
    State[State["Reviewed"] = 3] = "Reviewed";
    State[State["Done"] = 4] = "Done";
})(State || (State = {}));

我希望这些值是一个格式良好的字符串,在需要的地方带有空格。

所以State[State["PendingReview"] = 2] = "PendingReview"; 会变成State[State["PendingReview"] = 2] = "Pending Review";

通过像这样定义我的枚举,我已经设法实现了接近这个目标:

enum State {
    "Not Required",
    Working,
    "Pending Review",
    Reviewed,
    Done
}

但是,这样做的缺点是要在代码中使用带有空格的任何枚举值,我现在必须改用我的密钥。

所以State.PendingReview 现在必须像这样使用State["Pending Review"]

我可以通过为我的键定义一个替代显示字符串来两全其美吗?

所以当我说State[State.PendingReview] 时,它给了我"Pending Review" 的值

【问题讨论】:

    标签: enums typescript


    【解决方案1】:

    由于您没有为枚举指定显式值,因此您也可以为此使用字符串枚举(从 TypeScript 2.4 开始提供):

    enum State {
      NotRequired = "Not Required",
      Working = "Working",
      PendingReview = "Pending Review",
      Reviewed = "Reviewed",
      Done = "Done"
    }
    

    然后显示值简单地变成例如State.NotRequired.

    【讨论】:

      【解决方案2】:

      由于枚举不支持字符串值, 最好使用具有这样的静态字段的类。

      你有编译检查,就像你在哪里使用枚举一样,你在你的代码中也以同样的方式调用它。

      module rizze.tests {
      
      
      enum State{
           NotRequiered,
           Working,
           Pending,
           Reviewed,
           Done
      }
      
      class StateConvert {
          static NotRequiered="Not Required";
          static Working="I'm Working";
          static Pending = "Pending Review";
          static Reviewed="Reviewed Done";
          static Done="Done All";
      
          static convert(state:State):String{
              if( state == null) return null;
              switch(state){
                  case State.NotRequiered:{return StateConvert.NotRequiered;}
                  case State.Working:{return StateConvert.Working;}
                  case State.Pending:{return StateConvert.Pending;}
                  case State.Reviewed:{return StateConvert.Reviewed;}
                  case State.Done:{return StateConvert.Done;}
      
              }
                console.log("Error state  undefined + " +state );
                return null;  
      
          }
      }
      
      
      
      
      
       export class StateTest {
      
            constructor(){
               let state:State = State.Reviewed;
               console.log("state:"+state + " / " + StateConvert.convert(state));   
      
            }
      
        }
      
      //TEST
      let s:StateTest= new StateTest();
      

      }

      【讨论】:

      • 我仍然希望它们像State.PendingReview == 2 中的枚举,但State[State.PendingReview] == "Pending Review"
      • 您必须手动编码。因为这是使用 2 个完全不同且不兼容的原则(由于 typescript 语言设计)
      【解决方案3】:

      我能否通过某种方式定义一个替代方案来两全其美 向我的密钥显示字符串?

      没有。这在 TypeScript 中不受支持。如果您认为这很有价值,您可以尝试创建feature request

      【讨论】:

        猜你喜欢
        • 2018-05-26
        • 2019-10-18
        • 1970-01-01
        • 2020-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-07
        相关资源
        最近更新 更多