如何在TypeScript中创build枚举types?

我正在为TypeScript的Google maps API定义文件。

我需要定义一个像枚举types例如。 包含两个属性的google.maps.AnimationBOUNCEDROP

在TypeScript中应该怎么做?

TypeScript 0.9+有一个枚举规范:

 enum AnimationType { BOUNCE, DROP, } 

最后的逗号是可选的。

从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; 

这两个例子都直接从JavaScript的程序员的TypeScript中解脱出来。

请注意,这与0.8规范不同。 0.8规范看起来像这样 – 但它被标记为实验性的,可能会改变,所以你将不得不更新任何旧的代码:

免责声明 – 这个0.8例子将在新版本的TypeScript编译器中被破坏。

 enum TShirtSize { Small: 3, Medium: 5, Large: 8 } var mySize = TShirtSize.Large; 

这是现在的一部分语言。 有关此文档,请参阅TypeScriptLang.org>基本types>枚举 。 关于如何使用这些枚举的文档摘录如下:

 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(); 

这将logging:

 undefined 2 Blue 

因为在写这篇文章的时候,Typescript Playground会产生这样的代码:

 var myModule; (function (myModule) { (function (Color) { Color[Color["Red"] = 0] = "Red"; Color[Color["Green"] = 1] = "Green"; Color[Color["Blue"] = 2] = "Blue"; })(myModule.Color || (myModule.Color = {})); var Color = myModule.Color; ; var MyClass = (function () { function MyClass() { console.log(this.myColor); this.myColor = Color.Blue; console.log(this.myColor); console.log(Color[this.myColor]); } return MyClass; })(); myModule.MyClass = MyClass; })(myModule || (myModule = {})); var foo = new myModule.MyClass(); 

只是另一个说明,你可以用以下ID /string枚举:

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

更新

正如@ iX3所指出的, Typescript 2.4支持枚举string。

请参阅: 在Typescript中使用string值创build枚举


原始答案:

对于string成员值,TypeScript只允许将数字作为枚举成员值。 但是有一些解决scheme/黑客可以实施;

解决scheme1:

复制自: https : //blog.rsuter.com/how-to-implement-an-enum-with-string-values-in-typescript/

有一个简单的解决scheme:在分配之前,只需将stringstring强制转换

 export enum Language { English = <any>"English", German = <any>"German", French = <any>"French", Italian = <any>"Italian" } 

解决scheme2:

复制自: https : //basarat.gitbooks.io/typescript/content/docs/types/literal-types.html

您可以使用string作为types。 例如:

 let foo: 'Hello'; 

在这里,我们创build了一个名为foo的variables,它只允许将字面值“Hello”分配给它。 如下所示:

 let foo: 'Hello'; foo = 'Bar'; // Error: "Bar" is not assignable to type "Hello" 

它们本身并不是很有用,但可以组合在一个types联合中来创build一个强大的(有用的)抽象,例如:

 type CardinalDirection = "North" | "East" | "South" | "West"; function move(distance: number, direction: CardinalDirection) { // ... } move(1,"North"); // Okay move(1,"Nurth"); // Error!