Enums 如何在TypeScript中创建类似枚举的类型?

Enums 如何在TypeScript中创建类似枚举的类型?,enums,typescript,Enums,Typescript,我正在为Google maps API for TypeScript编写一个定义文件 我需要定义一个类似枚举的类型,例如google.maps.Animation,它包含两个属性:BOUNCE和DROP 如何在TypeScript中实现这一点?从TypeScript 0.9(目前是alpha版本)开始,您可以使用如下枚举定义: enum TShirtSize {   Small,   Medium,   Large } var mySize = TShirtSize.Large; 默认情况下

我正在为Google maps API for TypeScript编写一个定义文件

我需要定义一个类似枚举的类型,例如
google.maps.Animation
,它包含两个属性:
BOUNCE
DROP

如何在TypeScript中实现这一点?

从TypeScript 0.9(目前是alpha版本)开始,您可以使用如下枚举定义:

enum TShirtSize {
  Small,
  Medium,
  Large
}

var mySize = TShirtSize.Large;
默认情况下,将分别为这些枚举分配0、1和2。如果要显式设置这些数字,可以将其作为枚举声明的一部分

清单6.2带有显式成员的枚举

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

var mySize = TShirtSize.Large;
这两个例子都是直接从理论上提出来的

请注意,这与0.8规范不同。0.8规范看起来是这样的-但它被标记为实验性的,可能会更改,因此您必须更新任何旧代码:

免责声明-此0.8示例将在较新版本的TypeScript编译器中被破坏

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

var mySize = TShirtSize.Large;

TypeScript 0.9+具有枚举规范:

enum AnimationType {
    BOUNCE,
    DROP,
}

最后一个逗号是可选的

另一个注意事项是,您可以使用以下内容创建id/字符串枚举:

class EnumyObjects{
    public static BOUNCE={str:"Bounce",id:1};
    public static DROP={str:"Drop",id:2};
    public static FALL={str:"Fall",id:3};


}

这是语言的一部分。有关此方面的文档,请参阅。有关如何使用这些枚举的文档摘录:

enum Color {Red, Green, Blue};
var c: Color = Color.Green;
或使用手动支持号码:

enum Color {Red = 1, Green = 2, Blue = 4};
var c: Color = Color.Green;
您还可以使用例如
Color[2]
返回枚举名称

下面是一个例子,说明这一切是如何结合在一起的:

module myModule {
    export enum Color {Red, Green, Blue};

    export class MyClass {
        myColor: Color;

        constructor() {
            console.log(this.myColor);
            this.myColor = Color.Blue;
            console.log(this.myColor);
            console.log(Color[this.myColor]);
        }
    }
}

var foo = new myModule.MyClass();
这将记录:

未定义
2.
蓝色
因为在编写本文时,Typescript将生成以下代码:

var-myModule;
(功能(myModule){
(功能(颜色){
颜色[颜色[“红色”]=0]=“红色”;
颜色[颜色[“绿色”]=1]=“绿色”;
颜色[颜色[“蓝色”]=2]=“蓝色”;
})(myModule.Color | |(myModule.Color={}));
var Color=myModule.Color;
;
var MyClass=(函数(){
函数MyClass(){
console.log(this.myColor);
this.myColor=Color.Blue;
console.log(this.myColor);
log(Color[this.myColor]);
}
返回MyClass;
})();
myModule.MyClass=MyClass;
})(myModule | |(myModule={}));
var foo=new myModule.MyClass();

更新

正如@iX3所指出的,Typescript 2.4支持枚举字符串

见:


原始答案:

对于字符串成员值,TypeScript仅允许数字作为枚举成员值。但有一些解决方案/黑客可以实施

解决方案1:

抄袭自:

有一个简单的解决方案:只需将字符串文字强制转换为任意值,然后再指定:

export enum Language {
    English = <any>"English",
    German = <any>"German",
    French = <any>"French",
    Italian = <any>"Italian"
}
在这里,我们创建了一个名为foo的变量,该变量只允许将文字值“Hello”分配给它。这一点如下所示:

let foo: 'Hello';
foo = 'Bar'; // Error: "Bar" is not assignable to type "Hello"
它们本身并不是很有用,但可以组合在一个类型联合中,以创建一个强大(且有用)的抽象,例如:

type CardinalDirection =
    "North"
    | "East"
    | "South"
    | "West";

function move(distance: number, direction: CardinalDirection) {
    // ...
}

move(1,"North"); // Okay
move(1,"Nurth"); // Error!
typescript中的枚举: 枚举被放入typescript语言中,以定义一组命名常量。使用枚举可以使我们的生活更轻松。原因是这些常量通常比枚举表示的值更容易读取

创建枚举: 这个来自typescript文档的示例很好地解释了枚举的工作原理。请注意,我们的第一个枚举值(Up)初始化为1。然后,数字枚举的所有以下成员将从此值(即向下=2,左=3,右=4)自动递增。如果我们没有用1初始化第一个值,枚举将从0开始,然后自动递增(即Down=1,Left=2,Right=3)

使用枚举: 我们可以通过以下方式访问枚举的值:

Direction.Up;     // first the enum name, then the dot operator followed by the enum value
Direction.Down;
请注意,这样我们编写代码的方式更具描述性。枚举基本上阻止我们使用幻数(表示某种实体的数字,因为程序员在特定上下文中赋予了它们某种意义)。由于以下原因,幻数是不好的:

  • 我们需要更仔细地思考,首先需要将数字转换为实体,然后才能对代码进行推理
  • 如果我们在很长一段时间后审查我们的代码,或者其他程序员审查我们的代码,他们不一定知道这些数字意味着什么
    我建议在现阶段不要使用
    enum
    构造,因为TypeScript团队已经明确表示它将要更改-因此它将中断。请熟悉编辑工具,例如添加到答案中的代码。我在你的回答中改了,请看一下。另外,如果有关于该语言功能的相关讨论,请留下一些参考。enum Animation{BOUNCE=1,DROP},因为Maps API就是这样定义的。仅供参考,Google Maps v3定义现在已经完成,可以在上找到,您如何使用它访问它们的
    str
    id
    ?EnumyObjects.BOUNCE.str将访问该值。这种设计的问题是对象都是可变的,这可能会导致问题:
    抽象类
    是否更适合防止实例化,因为TypeScript没有
    静态类
    的概念?这现在应该是可以接受的答案,因为它仍在RC中工作,因此不太可能与TS的未来版本中断。TypeScript 2.4包括支持用于枚举中的字符串文字类型。看到和
    enum Direction {
        Up = 1,
        Down,
        Left,
        Right,
    }
    
    Direction.Up;     // first the enum name, then the dot operator followed by the enum value
    Direction.Down;