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

eNe*_*per 109 enums typescript

我正在为TypeScript的Google maps API制作定义文件.

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

应该如何在TypeScript中完成?

小智 129

TypeScript 0.9+有一个枚举规范:

enum AnimationType {
    BOUNCE,
    DROP,
}
Run Code Online (Sandbox Code Playgroud)

最后一个逗号是可选的.

  • 仅供参考,[TypeScript 0.9包含枚举的最终设计](http://blogs.msdn.com/b/typescript/archive/2013/06/18/announcing-typescript-0-9.aspx) (30认同)
  • 我建议不要在这个阶段使用`enum`构造,因为TypeScript团队很明显它会改变 - 所以它会破坏. (11认同)
  • 距离上次更新已经过去了 10 年,我只是想指出,上面反对使用 `enum` 的建议不再有效,因为 Typescript 完全支持这一点。[Typescript 枚举文档](https://www.typescriptlang.org/docs/handbook/enums.html) (2认同)

Fen*_*ton 64

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

enum TShirtSize {
  Small,
  Medium,
  Large
}

var mySize = TShirtSize.Large;
Run Code Online (Sandbox Code Playgroud)

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

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

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

var mySize = TShirtSize.Large;
Run Code Online (Sandbox Code Playgroud)

这两个示例都直接从TypeScript for JavaScript程序员中解脱出来.

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

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

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

var mySize = TShirtSize.Large;
Run Code Online (Sandbox Code Playgroud)

  • 现在这应该是公认的答案,因为它仍然在RC中工作,因此不太可能打破未来的TS版本. (3认同)

Jer*_*oen 23

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

enum Color {Red, Green, Blue};
var c: Color = Color.Green;
Run Code Online (Sandbox Code Playgroud)

或者使用手动支持号码:

enum Color {Red = 1, Green = 2, Blue = 4};
var c: Color = Color.Green;
Run Code Online (Sandbox Code Playgroud)

您也可以使用例如返回枚举名称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();
Run Code Online (Sandbox Code Playgroud)

这将记录:

undefined  
2  
Blue
Run Code Online (Sandbox Code Playgroud)

因为,在撰写本文时,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();
Run Code Online (Sandbox Code Playgroud)


don*_*son 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};


}
Run Code Online (Sandbox Code Playgroud)

  • 你怎么用它来访问他们的`str`和`id`? (2认同)
  • 这种设计的问题是对象都是可变的,这可能会导致问题:http://goo.gl/CT4Ip (2认同)

Art*_*hur 8

更新:

正如@ 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"
}
Run Code Online (Sandbox Code Playgroud)

解决方案2:

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

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

let foo: 'Hello';
Run Code Online (Sandbox Code Playgroud)

这里我们创建了一个名为foo的变量,它只允许为它分配文字值"Hello".这在下面说明:

let foo: 'Hello';
foo = 'Bar'; // Error: "Bar" is not assignable to type "Hello"
Run Code Online (Sandbox Code Playgroud)

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

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

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

move(1,"North"); // Okay
move(1,"Nurth"); // Error!
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

90866 次

最近记录:

7 年,1 月 前