繁体   English   中英

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

[英]How to create enum like type in TypeScript?

我正在为 TypeScript 的 Google 地图 API 编写定义文件。

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

这应该如何在 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;

这两个例子都是直接从TypeScript for JavaScript Programmers 中提取出来的。

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

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

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

var mySize = TShirtSize.Large;

这现在是语言的一部分。 有关这方面的文档,请参阅TypeScriptLang.org > Basic Types > enum 关于如何使用这些枚举的文档摘录:

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

这将记录:

 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支持枚举字符串。

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


原答案:

对于 String 成员值,TypeScript 只允许数字作为枚举成员值。 但是您可以实施一些解决方案/技巧;

解决方案1:

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

有一个简单的解决方案:只需在分配之前将字符串文字转换为 any 即可:

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!

打字稿中的枚举:

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

创建枚举:

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. 如果我们在一段时间后查看我们的代码,或者其他程序员查看我们的代码,他们不一定知道这些数字的含义。

对我来说可以输入这样的枚举(这也允许您将其作为对象循环):

enum: { [x: string]: string }

地图示例:

export const yourFunction = (
  enum: { [x: string]: string },
 ) => { 
  const iHaveBeenMapped = Object.keys(enum).map((key) => {
   const enumValue = enum[key];
  }); 
 } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM