Вопрос:

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

enums typescript

70637 просмотра

6 ответа

654 Репутация автора

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

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

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

Автор: eNepper Источник Размещён: 02.10.2012 09:29

Ответы (6)


58 плюса

147349 Репутация автора

Начиная с 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-программистов .

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

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

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

var mySize = TShirtSize.Large;
Автор: Fenton Размещён: 02.10.2012 09:40

109 плюса

1122 Репутация автора

Решение

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

enum AnimationType {
    BOUNCE,
    DROP,
}

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

Автор: Steve Lucco Размещён: 02.10.2012 09:45

14 плюса

1111 Репутация автора

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


}
Автор: done_merson Размещён: 04.10.2012 11:29

21 плюса

34862 Репутация автора

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

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

Потому что, на момент написания этого, Игровая площадка Тип будет генерировать этот код:

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();
Автор: Jeroen Размещён: 17.08.2015 01:23

6 плюса

242 Репутация автора

Обновление :

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

См .: Создание перечисления со строковыми значениями в Typcript


Оригинальный ответ:

Для значений членов 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!
Автор: Arthur Размещён: 22.11.2016 11:30

0 плюса

3495 Репутация автора

Перечисления в машинописном тексте:

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

Создание перечисления:

enum Direction {
    Up = 1,
    Down,
    Left,
    Right,
}

В этом примере из документов типов документов очень хорошо объясняется, как работают перечисления. Обратите внимание, что наше первое значение enum (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. Если мы пересмотрим наш код через некоторое время или другие программисты просмотрят наш код, они не обязательно знают, что подразумевается под этими цифрами.
Автор: Willem van der Veen Размещён: 15.11.2018 09:00
Вопросы из категории :
32x32