Как создать перечислимый тип в TypeScript?


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

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

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

5 88

5 ответов:

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

enum AnimationType {
    BOUNCE,
    DROP,
}

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

начиная с 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;

теперь это часть языка. См.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

потому что, на момент написания этого, 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


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

для значений строковых элементов 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!