Как создать enum как тип в TypeScript?

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

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

Как это должно быть сделано в TypeScript?

 eNepper26 окт. 2012 г., 14:13
Определение Google Maps v3 завершено и его можно найти наGithub а такжеNuGet

Ответы на вопрос(6)

Это теперь часть языка. УвидетьTypeScriptLang.org & gt; Основные типы & gt; перечисление для документации по этому вопросу. Выдержка из документации о том, как использовать эти перечисления:

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

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

enum TShirtSize {
  Small,
  Medium,
  Large
}

var mySize = TShirtSize.Large;

По умолчанию этим перечислениям будут присвоены 0, 1 и 2 соответственно. Если вы хотите явно установить эти числа, вы можете сделать это как часть объявления enum.

Листинг 6.2. Перечисления с явными членами

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

var mySize = TShirtSize.Large;

Оба эти примера взяты непосредственно изTypeScript для программистов JavaScript.

Note that this is different to the 0.8 specification. Спецификация 0.8 выглядела так: но она была помечена как экспериментальная и может измениться, поэтому вам придется обновить любой старый код:

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

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

var mySize = TShirtSize.Large;
 06 мар. 2014 г., 18:18
Теперь это должен быть принятый ответ, так как он все еще работает в RC и поэтому вряд ли сломается с будущими версиями TS.
Enums in typescript:

Перечисления помещаются в язык машинописи для определения набора именованных констант. Использование перечислений может сделать нашу жизнь проще. Причина этого заключается в том, что эти константы часто легче читать, чем значение, которое представляет перечисление.

Creating a enum:
enum Direction {
    Up = 1,
    Down,
    Left,
    Right,
}

Этот пример из документации по машинописи очень хорошо объясняет, как работают перечисления. Обратите внимание, что наше первое значение перечисления (Up) инициализируется значением 1. Тогда все следующие члены перечисления числаauto incremented из этого значения (т.е. вниз = 2, влево = 3, вправо = 4). Если бы мы не инициализировали первое значение с 1, перечисление начиналось бы с 0, а затем с автоприращением (то есть Down = 1, Left = 2, Right = 3).

Using an enum:

Мы можем получить доступ к значениям перечисления следующим образом:

Direction.Up;     // first the enum name, then the dot operator followed by the enum value
Direction.Down;

Обратите внимание, что таким образом мы гораздо большеdescriptive в том, как мы пишем наш код. Перечисления в основном не позволяют нам использоватьmagic numbers (числа, которые представляют некоторую сущность, потому что программист дал им значение в определенном контексте). Магические числа плохие по следующим причинам:

We need to think harder, we first need to translate the number to an entity before we can reason about our code. If we review our code after a long while, or other programmers review our code, they don't necessarily know what is meant with these numbers.

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


}
 29 мар. 2013 г., 01:15
EnumyObjects.BOUNCE.str будет обращаться к значению.
 28 мар. 2013 г., 02:49
Как бы вы получили доступ к ихstr а такжеid используя это?
 13 мая 2013 г., 09:57
Проблема этого дизайна в том, что все объекты являются изменяемыми, что может вызвать проблемы:goo.gl/CT4Ip
 25 нояб. 2015 г., 18:25
Было быabstract class быть более подходящим для предотвращения создания экземпляров, так как TypeScript не имеет понятияstatic class?

Update:

Как отмечает @ iX3,Typescript 2.4 имеет поддержку для перечисления строк.

Увидеть:Создайте перечисление со строковыми значениями в Typescript

Original answer:

Для значений элементов String TypeScript допускает только числа в качестве значений элементов перечисления. Но есть несколько решений / хаков, которые вы можете реализовать;

Solution 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"
}

solution 2:

скопировано из:https://basarat.gitbooks.io/typescript/content/docs/types/literal-types.html

Вы можете использовать строковый литерал в качестве типа. Например:

let foo: 'Hello';

Здесь мы создали переменную с именем foo, которая будет разрешать только литеральное значение & quot; Hello & apos; быть назначенным на это. Это продемонстрировано ниже:

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!
 25 сент. 2017 г., 20:10
TypeScript 2.4 включает поддержку строковых литеральных типов в перечислениях. Увидетьstackoverflow.com/questions/15490560/… а такжеblogs.msdn.microsoft.com/typescript/2017/06/27/…
Решение Вопроса

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

enum AnimationType {
    BOUNCE,
    DROP,
}

Последняя запятая не обязательна.

 27 авг. 2013 г., 21:28
 02 окт. 2012 г., 12:06
Пожалуйста, будьте удобны с инструментами редактирования, например, с кодом, который вы добавляете в свой ответ. Я изменил это в вашем ответе, посмотрите пожалуйста. Также, пожалуйста, оставьте некоторую ссылку, если есть соответствующая дискуссия об этой языковой функции.
 17 окт. 2012 г., 12:15
enum Animation {BOUNCE = 1, DROP}, поскольку именно так их определяет API Карт.
 02 окт. 2012 г., 12:05
Я бы посоветовал не использоватьenum создайте на этом этапе, так как команда TypeScript ясно дала понять, что она изменится - так что она сломается.

Ваш ответ на вопрос