【问题标题】:Can I have an Enum reference a text string?我可以让 Enum 引用文本字符串吗?
【发布时间】:2014-09-16 15:57:13
【问题描述】:

我知道我可以有这样的枚举:

enum TShirtSize {
  Small = 3,
  Medium = 5,
  Large = 8
}

var mySize = TShirtSize.Large;

但是有什么方法可以指定文本字符串而不是数字 3,5 和 8 吗?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    您可以创建一个可用于纯字符串枚举的类。演示:

    class Enum {
        constructor(private value: string) { }
        /** For equality == with string */
        toString() {return this.value }
        /** For send to server serialization */
        toJSON() {return this.value }
    }
    
    class Foo extends Enum {    
        static First = new Foo('First')
    }
    
    // From server to browser
    var recievedDTO: { something: Foo } = <any>{
        something: 'First'
    }
    console.log(recievedDTO.something == Foo.First); // true
    
    // To server 
    var sendDTO = {
        something: Foo.First,
    }
    console.log(JSON.stringify(sendDTO) == '{"something":"First"}'); // true
    
    // Warning: don't use `===`
    console.log(recievedDTO.something === Foo.First); // false 
    

    【讨论】:

      【解决方案2】:

      为此使用字典:

      var enumStrings: { [id: TShirtSize] : string; } = {};
      enumStrings[TShirtSize.Small] = "Very Small";
      

      【讨论】:

        【解决方案3】:

        否 - 字符串不允许作为“数字原始类型的子类型”的枚举值。

        TypeScript Language Specification 的几个部分对此进行了介绍。

        (从 9.1 开始)枚举类型是 Number 基本类型的不同子类型

        (从 9.2 开始)枚举声明的主体定义了零个或多个枚举成员,它们是 枚举类型。 每个枚举成员都有一个由 枚举声明

        (从 9.2 开始)为计算成员指定的表达式必须产生 Any 类型、Number 基本类型或枚举类型本身的值

        但是,请注意,对整数的限制至少是“可取的”,

        (从 9.2 开始)ConstantEnumMemberSection 引入一个或多个具有 连续的常量成员 从指定常量值开始的整数值1

        (从 1.7 开始)第 9 节描述了程序员如何显式地将整数分配给枚举成员..

        1 在当前的 TypeScript 编译器中,如果指定了非整数,则必须为以下成员显式赋值;但是, 允许使用非整数作为常量。这遵循上述 LS 规则,即枚举是 number 的子类型,而不是更精细的“整数”。

        【讨论】:

          【解决方案4】:

          如果您希望能够将标识符用作字符串描述;您可以获得枚举的值(一个整数)及其名称 - 这是一个示例:

          enum TShirtSize {
            Small = 3,
            Medium = 5,
            Large = 8
          }
          
          // 8
          var sizeValue = TShirtSize.Large;
          
          // "Large"
          var sizeName = TShirtSize[sizeValue];
          

          您可能还想看看type-safe enum 模式,因为这在某些情况下很有用。

          【讨论】:

            【解决方案5】:

            Enum 值存储为integers, 我认为您不能将字符串常量存储为其任何值。 但是,您可以使用 # define 来使用符号常量, 例如:

            > # define small  "any string1"
            > # define medium "any string2"
            

            等等..

            【讨论】:

              猜你喜欢
              • 2017-04-16
              • 1970-01-01
              • 1970-01-01
              • 2016-10-04
              • 2011-08-19
              • 2010-09-29
              相关资源
              最近更新 更多