簡體   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