我可以将Enum引用文本字符串吗?

时间:2014-09-13 05:38:34

标签: typescript

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

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

var mySize = TShirtSize.Large;

但有没有办法可以指定文本字符串而不是数字3,5和8?

5 个答案:

答案 0 :(得分:3)

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

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 

答案 1 :(得分:1)

否 - 不允许使用字符串作为枚举的值,这些枚举是&#34;数字原始类型&#34;的子类型。

TypeScript Language Specification部分介绍了这一点。

  

(从9.1开始)枚举类型是数字基元类型的独特子类型

     

(从9.2开始)枚举声明的主体定义了零个或多个枚举成员,这些成员是指定的值   枚举类型。 每个枚举成员都有一个由基元类型引入的关联数值   枚举声明

     

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

但是,请注意,对整数的限制至少是建议&#34;,

  

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

     

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

1 在当前的TypeScript编译器中,如果指定了非整数,则必须明确地为以下成员分配值;但 允许使用非积分作为常量。根据上述LS规则,枚举是 number 的子类型,而不是更精细的&#34;整数&#34;。

答案 2 :(得分:1)

使用字典:

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

答案 3 :(得分:1)

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

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

// 8
var sizeValue = TShirtSize.Large;

// "Large"
var sizeName = TShirtSize[sizeValue];

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

答案 4 :(得分:0)

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

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

依旧......