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


120

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

我需要定义一个枚举,例如类型。google.maps.Animation其中包含两个属性:BOUNCEDROP

如何在TypeScript中完成此操作?


3
Google Maps v3的定义现已完成,可以在GithubNuGet
eNepper 2012年

Answers:


140

TypeScript 0.9+具有针对枚举的规范:

enum AnimationType {
    BOUNCE,
    DROP,
}

最后的逗号是可选的。


11
我建议不要enum在此阶段使用该构造,因为TypeScript团队已经清楚地表明它将进行更改-因此它将中断。
Fenton '10

1
请使自己适应编辑工具,例如,添加到答案中的代码。我将其更改为您的答案,请看一看。如果有关于该语言功能的相关讨论,也请留下一些参考。
hakre 2012年

列举动画{BOUNCE = 1,DROP},因为这是Maps API定义它们的方式。
dchest


枚举及其成员命名约定与c#中的相同。(均来自Microsoft)。是PascalCase。不是UPPER_CASE。
多米尼克

66

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

这两个示例都直接从TypeScript for JavaScript Programmers中提出

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

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

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

var mySize = TShirtSize.Large;

3
现在,这应该是可以接受的答案,因为它仍在RC中运行,因此不太可能与将来的TS版本兼容。
Adrian Grigore 2014年

24

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

enum Color {Red, Green, Blue};
var c: Color = Color.Green;

或带有手动后备号码:

enum Color {Red = 1, Green = 2, Blue = 4};
var c: Color = Color.Green;

您也可以使用example返回到枚举名称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();

这将记录:

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

14

请注意,您可以使用以下代码进行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};


}

2
您将如何访问他们strid使用它?
kba

1
EnumyObjects.BOUNCE.str将访问该值。
done_merson

2
这种设计的问题在于对象都是可变的,可能会引起问题:goo.gl/CT4Ip
Fenton

abstract class因为打字稿不具备的一个概念,是比较合适的,以防止实例static class
jocull 2015年

10

更新

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

请参阅:在Typescript中使用字符串值创建一个枚举


原始答案:

对于String成员值,TypeScript仅允许数字作为枚举成员值。但是您可以实现一些解决方案/黑客。

解决方案1:

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

有一个简单的解决方案:只需在分配前将字符串文字转换为任意值:

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

解决方案2:

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

您可以使用字符串文字作为类型。例如:

let foo: 'Hello';

在这里,我们创建了一个名为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!

1
TypeScript 2.4支持枚举中的字符串文字类型。参见stackoverflow.com/questions/15490560/…blogs.msdn.microsoft.com/typescript/2017/06/27/…–
iX3

1

打字稿中的枚举:

枚举被放入打字稿语言中,以定义一组命名常量。使用枚举可以使我们的生活更轻松。原因是这些常量通常比枚举表示的值更易于阅读。

创建一个枚举:

enum Direction {
    Up = 1,
    Down,
    Left,
    Right,
}

这个来自打字稿文档的示例很好地解释了枚举的工作方式。请注意,我们的第一个枚举值(Up)用1初始化。然后,该枚举的所有以下所有成员都从该值自动递增(即Down = 2,Left = 3,Right = 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;

注意,通过这种方式,我们在编写代码时更具描述性。枚举基本上阻止了我们使用幻数(代表某些实体的数字,因为程序员在特定上下文中为其赋予了含义)。幻数不好是由于以下原因:

  1. 我们需要加倍思考,首先需要将数字转换为实体,然后才能推理代码。
  2. 如果我们过了很长时间才查看代码,或者其他程序员查看了我们的代码,他们不一定知道这些数字的含义。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.