Як створити enum типу типу в TypeScript?


120

Я працюю над файлом визначень для API Maps Maps для TypeScript.

І мені потрібно визначити тип enum, наприклад, google.maps.Animationякий містить дві властивості: BOUNCEі DROP.

Як це зробити в TypeScript?


3
Визначення Google Maps v3 вже завершено, і їх можна знайти в Github та NuGet
eNepper

Відповіді:


140

TypeScript 0.9+ має специфікацію для перерахунків:

enum AnimationType {
    BOUNCE,
    DROP,
}

Заключна кома необов’язкова.


11
Я б радив не використовувати enumконструкцію на цьому етапі, оскільки команда TypeScript дала зрозуміти, що вона зміниться - тому вона зламається.
Фентон

1
Будь ласка, поцікавтеся інструментами редагування, наприклад кодом, який ви додасте до своєї відповіді. Я змінив це у вашій відповіді на, подивіться будь ласка. Також, будь ласка, залиште деяку посилання, якщо є відповідна дискусія щодо цієї функції мови.
хакре

enum Animation {BOUNCE = 1, DROP}, оскільки саме так API API визначає їх.
дчест


Перелічення enum та його членів називають такі ж, як у c #. (обидва від Microsoft). Це PascalCase. Не UPPER_CASE.
Домінік

66

Станом на TypeScript 0.9 (на даний момент альфа-реліз) ви можете використовувати визначення enum таким чином:

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
Тепер це має бути прийнятою відповіддю, оскільки він все ще працює в РК, і тому навряд чи вдасться розірватися з майбутніми версіями ТС.
Адріан Григоре

24

Це зараз частина мови. Дивіться 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();

Це ввійде:

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

14

Ще одна примітка, що ви можете перерахувати 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};


}

2
Як би ви отримали доступ до їх strі idвикористовуєте це?
kba

1
EnumyObjects.BOUNCE.str отримав би доступ до значення.
done_merson

2
Проблема цієї конструкції полягає в тому, що всі об'єкти можуть змінюватися, що може спричинити проблеми: goo.gl/CT4Ip
Fenton

Би abstract class б доречніше запобігти створенням екземплярів, оскільки TypeScript не має поняття a static class?
Jocull

10

Оновлення :

Як зазначає @ 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!

1
TypeScript 2.4 включає підтримку рядкових літеральних типів в перерахунках. Див stackoverflow.com/questions/15490560 / ... і blogs.msdn.microsoft.com/typescript/2017/06/27 / ...
ix3

1

Перераховується в машинопис:

Енуми вводяться мовою машинопису для визначення набору названих констант. Використання переліків може полегшити наше життя. Причиною цього є те, що ці константи часто легше читати, ніж значення, яке представляє перерахунок.

Створення перерахунку:

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

Цей приклад із документів машинопису дуже добре пояснює, як працюють перехідники. Зауважте, що наше перше значення перерахунку (вгору) ініціалізується з 1. Усі наступні члени перерахунку числа автоматично збільшуються від цього значення (тобто вниз = 2, вліво = 3, вправо = 4). Якби ми не ініціалізували перше значення з 1, перерахунок починається з 0, а потім автоматично збільшується (тобто вниз = 1, вліво = 2, вправо = 3).

Використання enum:

Ми можемо отримати доступ до значень enum наступним чином:

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

Зауважте, що таким чином ми набагато більш описові в тому, як пишемо наш код. Енуми в основному заважають нам використовувати магічні числа (числа, які представляють якусь сутність, тому що програміст надав їм значення в певному контексті). Магічні числа погані через наступні причини:

  1. Нам потрібно думати більше, перш за все нам потрібно перевести число в сутність, перш ніж ми зможемо обґрунтувати наш код.
  2. Якщо ми перевіряємо наш код через довгий час, або інші програмісти переглядають наш код, вони не обов'язково знають, що розуміється під цими номерами.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.