Как создать тип перечисления типа TypeScript?

Я работаю над файлом определений для API карт Google для TypeScript.

И мне нужно определить тип перечисления, например. google.maps.Animation, который содержит два свойства: BOUNCE и DROP.

Как это сделать в TypeScript?

Ответ 1

TypeScript 0.9+ имеет спецификацию перечислений:

enum AnimationType {
    BOUNCE,
    DROP,
}

Конечная запятая не является обязательной.

Ответ 2

Как и в случае с TypeScript 0.9 (в настоящее время альфа-релиз), вы можете использовать определение перечисления следующим образом:

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 для программистов JavaScript.

Обратите внимание, что это отличается от спецификации 0.8. Спецификация 0.8 выглядела так: но она была отмечена как экспериментальная и, вероятно, изменилась, поэтому вам придется обновить любой старый код:

Отказ от ответственности - этот пример 0.8 будет разбит на новые версии компилятора TypeScript.

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

var mySize = TShirtSize.Large;

Ответ 3

Теперь это часть языка. См. TypeScriptLang.org > Основные типы > 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();

Это будет log:

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

Ответ 4

Еще одно замечание о том, что вы можете перечислить 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};


}

Ответ 5

Обновление

Как отмечено @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!