Utwórz wyliczenie z wartościami ciągu

262

Do utworzenia enumw TypeScript można użyć następującego kodu :

enum e {
    hello = 1,
    world = 2
};

Do wartości można uzyskać dostęp poprzez:

e.hello;
e.world;

Jak utworzyć wartość enumciągu?

enum e {
    hello = "hello", // error: cannot convert string to e
    world = "world"  // error 
};
FacePalm
źródło
heads up typy Singleton pod postacią literałów typu string # 1003 powinny rozwiązać ten problem
Andreas Frische

Odpowiedzi:

409

TypeScript 2.4

Teraz ma wyliczanie ciągów, więc twój kod po prostu działa:

enum E {
    hello = "hello",
    world = "world"
};

🌹

TypeScript 1.8

Od TypeScript 1.8 można używać literałów ciągów, aby zapewnić niezawodne i bezpieczne korzystanie z nazwanych ciągów znaków (do czego częściowo używane są wyliczenia).

type Options = "hello" | "world";
var foo: Options;
foo = "hello"; // Okay 
foo = "asdf"; // Error!

Więcej informacji: https://www.typescriptlang.org/docs/handbook/advanced-types.html#string-literal-types

Wsparcie dla starszych wersji

Wyliczenia w TypeScript są oparte na liczbach.

Możesz jednak użyć klasy z elementami statycznymi:

class E
{
    static hello = "hello";
    static world = "world"; 
}

Możesz także powiedzieć:

var E = {
    hello: "hello",
    world: "world"
}

Aktualizacja: W oparciu o wymaganie, aby móc zrobić coś takiego, var test:E = E.hello;spełnia następujące wymagania:

class E
{
    // boilerplate 
    constructor(public value:string){    
    }

    toString(){
        return this.value;
    }

    // values 
    static hello = new E("hello");
    static world = new E("world");
}

// Sample usage: 
var first:E = E.hello;
var second:E = E.world;
var third:E = E.hello;

console.log("First value is: "+ first);
console.log(first===third); 
basarat
źródło
Mała poprawa:toString(): string { return this.value; }
psulek
@psulek Właściwie maszynopis wywnioskuje, że toStringzwraca ciąg, ponieważ zwraca this.valuei valuejest typu ciąg. Więc nie możesz tego zrobić, var x:number = E.hello.toString();a jeśli to zrobisz, var x = E.hello.toString();x ma również postać typu string:)
basarat
2
@BASarat To prawda, że ​​maszynopis obsługuje taki przypadek, ale mam na myśli, że zawsze udekorowaliśmy metody typami zwracanymi za każdym razem, gdy ją znamy, nawet nie jest to konieczne dla kompilatora ts, ale dla nas, koderów, aby wiedzieć, kiedy zobaczyliśmy definicję metody, co wpisz to zwraca.
psulek
@basarat: czy zastąpienie tej get()metody ma jakąś wadę return this.value? W ten sposób zwróci wartość ciągu przy każdym dostępie, a nie tylko podczas konwersji toString().
Jan
@basarat Jeśli masz kilka takich „wyliczeń”, kompilator nie będzie ich rozróżniał z powodu typowania strukturalnego - kompilator zobaczy valueelement członkowski na wszystkich typach i potraktuje je jako typy porównywalne. Możesz jednak ustawić valueczłonka jako prywatny. W ten sposób kompilator go nie zobaczy i nie spróbuje zastosować typowania strukturalnego.
Kirill G.
113

W najnowszej wersji (1.0RC) TypeScript możesz używać takich znaków:

enum States {
    New,
    Active,
    Disabled
} 

// this will show message '0' which is number representation of enum member
alert(States.Active); 

// this will show message 'Disabled' as string representation of enum member
alert(States[States.Disabled]);

Aktualizacja 1

Aby uzyskać wartość liczbową elementu enum z wartości ciągu, możesz użyć tego:

var str = "Active";
// this will show message '1'
alert(States[str]);

Aktualizacja 2

W najnowszym TypeScript 2.4 wprowadzono wyliczenia ciągów, takie jak to:

enum ActionType {
    AddUser = "ADD_USER",
    DeleteUser = "DELETE_USER",
    RenameUser = "RENAME_USER",

    // Aliases
    RemoveUser = DeleteUser,
}

Aby uzyskać więcej informacji o TypeScript 2.4, przeczytaj blog na MSDN .

psulek
źródło
2
Ogólnie rzecz biorąc, to rozwiązanie jest preferowane (ponieważ jest to prawdziwe wyliczenie), jednak jesteś bardzo ograniczony tym, co to jest nazwa wyliczenia (stąd „ciąg”).
JasonS
2
Najlepsze rozwiązanie na dziś.
Alon Amir,
2
Coś nowego na ten temat? Ponieważ w States[str]dzisiejszych czasach nie działa. Type 'string' is not assignable to type 'States'
MrCroft,
1
@MrCroft Możesz użyć: States[str as any]do wykonania w bieżącej (2.x) wersji Typescript.
psulek
Stany [str] to to, czego szukałem. Dzięki!
Martin Konicek
81

TypeScript 2.4+

Możesz teraz przypisywać wartości ciągów bezpośrednio członom wyliczającym:

enum Season {
    Winter = "winter",
    Spring = "spring",
    Summer = "summer",
    Fall = "fall"
}

Aby uzyskać więcej informacji, patrz # 15486 .

TypeScript 1.8+

W TypeScript 1.8+ można utworzyć literał ciąg znaków, aby zdefiniować typ i obiekt o tej samej nazwie dla listy wartości. Naśladuje oczekiwane zachowanie enum strunowego.

Oto przykład:

type MyStringEnum = "member1" | "member2";

const MyStringEnum = {
    Member1: "member1" as MyStringEnum,
    Member2: "member2" as MyStringEnum
};

Który będzie działał jak wyliczenie łańcucha:

// implicit typing example
let myVariable = MyStringEnum.Member1; // ok
myVariable = "member2";                // ok
myVariable = "some other value";       // error, desired

// explict typing example
let myExplicitlyTypedVariable: MyStringEnum;
myExplicitlyTypedVariable = MyStringEnum.Member1; // ok
myExplicitlyTypedVariable = "member2";            // ok
myExplicitlyTypedVariable = "some other value";   // error, desired

Upewnij się, że wpisałeś wszystkie ciągi w obiekcie! Jeśli tego nie zrobisz, w pierwszym przykładzie powyżej zmienna nie zostałaby domyślnie wpisana MyStringEnum.

David Sherret
źródło
1
Jak mogę zdefiniować coś podobnego w pliku deklaracji?
Zev Spitz,
@ZevSpitz można zrobić, to
David Sherret
Warto zauważyć, że przy obecnym kompilatorze możesz błędnie wpisać wartości ciągu w MyStringEnum i nie będzie narzekać. Tworzę interfejs modułu Enforcer, aby upewnić się, że moje ciągi są zawsze prawidłowe. Na przykład: interface MyStringEnumEnforcer {Member1: MyStringEnum, Member2: MyStringEnum} Następnie const MyStringEnum: MyStringEnumEnforcer = {Member1: "member1", Member2: "member2"} To nie pozwala na błędnie napisane ciągi, chociaż kompilator może przestać działać ostatecznie oryginalny scenariusz. Przy takim podejściu odbywa się wiele ceremonii, ale lubię bezpieczeństwo.
jmorc
40

W TypeScript 0.9.0.1, mimo że występuje błąd kompilatora, kompilator nadal może skompilować plik ts do pliku js. Kod działa zgodnie z naszymi oczekiwaniami, a Visual Studio 2012 może obsługiwać automatyczne uzupełnianie kodu.

Aktualizacja :

W składni TypeScript nie pozwala nam tworzyć wyliczenia z wartościami łańcuchowymi, ale możemy zhakować kompilator: p

enum Link
{
    LEARN   =   <any>'/Tutorial',
    PLAY    =   <any>'/Playground',
    GET_IT  =   <any>'/#Download',
    RUN_IT  =   <any>'/Samples',
    JOIN_IN =   <any>'/#Community'
}

alert('Link.LEARN:    '                     + Link.LEARN);
alert('Link.PLAY:    '                      + Link.PLAY);
alert('Link.GET_IT:    '                    + Link.GET_IT);
alert('Link[\'/Samples\']:    Link.'        + Link['/Samples']);
alert('Link[\'/#Community\']    Link.'      + Link['/#Community']);

Plac zabaw

MINATO Azuma
źródło
1
Fajny hack, ale nie możesz użyć tych enum / stałych w instrukcji switch, np. case Link.LEARN:Dostanie Cannot convert 'Link.LEARN' to 'string'błąd kompilacji. Przesyłanie nie będzie działać.
Gone Coding
@TrueBlueAussie Wygląda na to, że działa dobrze dla mnie z TSC 1.0.0.0. Ponadto, jeśli z jakiegoś powodu musisz wstawić ciąg / zmienną ciąg do instrukcji case, zadziała, jeśli rzucisz ją na dowolny.
CodeAndCats
1
Ponadto, dzięki @ zjc0816, cholernie uwielbiam to rozwiązanie :)
CodeAndCats
to jest rozwiązanie, którego chciałem.
Murhaf Sousli
5
Zabawne, zastanawiam się, dlaczego TypeScript nie obsługuje już tylko ciągów enum ... Wiele osób tego chce (w tym mnie).
Hendy Irawan
23

TypeScript 2.1 +

Typy wyszukiwania wprowadzone w TypeScript 2.1 pozwalają na inny wzorzec do symulacji ciągów znaków:

// String enums in TypeScript 2.1
const EntityType = {
    Foo: 'Foo' as 'Foo',
    Bar: 'Bar' as 'Bar'
};

function doIt(entity: keyof typeof EntityType) {
    // ...
}

EntityType.Foo          // 'Foo'
doIt(EntityType.Foo);   // 👍
doIt(EntityType.Bar);   // 👍
doIt('Foo');            // 👍
doIt('Bad');            // 🙁 

TypeScript 2.4 +

W wersji 2.4 TypeScript wprowadził natywną obsługę wyliczeń ciągów, więc powyższe rozwiązanie nie jest potrzebne. Z dokumentacji TS:

enum Colors {
  Red = "RED",
  Green = "GREEN",
  Blue = "BLUE",
}
Michael Bromley
źródło
Jak mam to zrobić, jeśli nazwa klucza wyliczeniowego jest inna niż wartość ciągu (ponieważ na przykład jest bardzo długa)?
CletusW
Nieważne! Rozwiązane w odpowiedzi @ Łukasza-pniewskiego poniżej stackoverflow.com/a/42820134/1431146
CletusW
tslint wyrzuci błąd na tym przykładzie String-Enum podczas próby odwrotnego odwzorowania Enum: Element niejawnie ma typ „dowolny”, ponieważ wyrażenie indeksu nie jest typu „liczba”. Wydaje mi się, że problem polega na tym, że w ciągach znaków TS Enums nie można odwzorować odwrotnie, patrz komentarz w przykładzie String-Enum na typescriptlang.org/docs/handbook/release-notes/… - Wydaje się, że tak jest w przypadku TS 2.4, gdzie Wprowadzono String-Enum, ale pojawia się również błąd w TS 2.6.2. Przykład: Colors["RED"]nie będzie działać. Każdy pomysł, jak to rozwiązać (wymagany do konwersji JSON).
masi
19

Dlaczego nie skorzystać z natywnego sposobu uzyskiwania dostępu do ciągów wyliczenia.

enum e {
  WHY,
  NOT,
  USE,
  NATIVE
}

e[e.WHY] // this returns string 'WHY'
Mient-jan Stelling
źródło
2
Oto odpowiedź, której szukałem, dzięki! Inne rozwiązania to sprytne obejścia, ale to takie proste :)
M--
19
To nie odpowiada na pytanie. Pytanie nie dotyczy dostępu do ciągów wyliczenia. enum Why { Because = "You Can't", Always = "Do Things That Way." };)
James Wilkins,
Podczas używania wyliczeń wartości liczbowych występują problemy, takie jak 0 jest fałszem, trudniejszy do debugowania itp.
robmcm
@robmcm rozwiązane enum e {DLACZEGO = 1, NOT = 2, USE = 3, NATIVE = 4} e [e.WHY] // to zwraca ciąg „DLACZEGO”
Mient-jan Stelling
16

Możesz używać wyliczeń ciągów w najnowszym TypeScript:

enum e
{
    hello = <any>"hello",
    world = <any>"world"
};

Źródło: https://blog.rsuter.com/how-to-implement-an-enum-with-string-values-in-typescript/


AKTUALIZACJA - 2016

Nieco bardziej niezawodny sposób tworzenia zestawu ciągów, których obecnie używam w React, jest następujący:

export class Messages
{
    static CouldNotValidateRequest: string = 'There was an error validating the request';
    static PasswordMustNotBeBlank: string = 'Password must not be blank';   
}

import {Messages as msg} from '../core/messages';
console.log(msg.PasswordMustNotBeBlank);
Richard
źródło
1
To był najbardziej zwięzły sposób, który wykonał dla mnie pracę ... Przynajmniej dopóki nie
wymyślę
Jednak jednym z problemów jest to, że <string>e.hellopowoduje błąd. e.hellojest nadal uważany przez kompilator za liczbę. <number>e.hellojednak działa. Czy jest na to jakiś sposób? Mogę tylko myśleć <string><any>e.hello.
RainingChain
Inną kwestią jest to, że posiadanie elementu wyliczeniowego jest równe wartości wyliczeniowej. Np .:enum Test { a = <any>"b", b = <any>"c", c = <any>"a" } Test.a === 'c'
RainingChain
Cały czas używam tej metody. Skała enum smyczkowego. Rozczarowujące jest to, że kompilator nie obsługuje pierwszej klasy literałów łańcuchowych, ale ma obsługę drugiej klasy. Kompilator faktycznie wie, kiedy użyłeś haka <any>, ponieważ powstrzyma cię on przed użyciem go w pliku .d.ts - to dla mnie daje pewną legitymację do użycia tego "hacka", ponieważ kompilator jest oczywiście świadomy ale nie zatrzymuje go całkowicie.
CodeAndCats
Btw, jeśli chcesz porównać wartość ciągu z wartością wyliczenia ciągu, a następnie <any><string>someStringValue == someEnumValue.toString()
rzutować
10

Oto dość czyste rozwiązanie, które umożliwia dziedziczenie za pomocą TypeScript 2.0. Nie próbowałem tego na wcześniejszej wersji.

Bonus: wartość może być dowolnego typu!

export class Enum<T> {
  public constructor(public readonly value: T) {}
  public toString() {
    return this.value.toString();
  }
}

export class PrimaryColor extends Enum<string> {
  public static readonly Red = new Enum('#FF0000');
  public static readonly Green = new Enum('#00FF00');
  public static readonly Blue = new Enum('#0000FF');
}

export class Color extends PrimaryColor {
  public static readonly White = new Enum('#FFFFFF');
  public static readonly Black = new Enum('#000000');
}

// Usage:

console.log(PrimaryColor.Red);
// Output: Enum { value: '#FF0000' }
console.log(Color.Red); // inherited!
// Output: Enum { value: '#FF0000' }
console.log(Color.Red.value); // we have to call .value to get the value.
// Output: #FF0000
console.log(Color.Red.toString()); // toString() works too.
// Output: #FF0000

class Thing {
  color: Color;
}

let thing: Thing = {
  color: Color.Red,
};

switch (thing.color) {
  case Color.Red: // ...
  case Color.White: // ...
}
Westy92
źródło
1
Świetna odpowiedź! Walczyłem, aby stworzyć obiekt podobny do Enum z obsługą dziedziczenia.
DanielM
Przykład użycia opartego na klasach Enum: goo.gl/SwH4zb (link do placu zabaw TypeScript).
DanielM
8

Hacky sposób na to jest:

CallStatus.ts

enum Status
{
    PENDING_SCHEDULING,
    SCHEDULED,
    CANCELLED,
    COMPLETED,
    IN_PROGRESS,
    FAILED,
    POSTPONED
}

export = Status

Utils.ts

static getEnumString(enum:any, key:any):string
{
    return enum[enum[key]];
}

Jak używać

Utils.getEnumString(Status, Status.COMPLETED); // = "COMPLETED"
nishantkyal
źródło
7

To działa dla mnie:

class MyClass {
    static MyEnum: { Value1; Value2; Value3; }
    = {
        Value1: "Value1",
        Value2: "Value2",
        Value3: "Value3"
    };
}

lub

module MyModule {
    export var MyEnum: { Value1; Value2; Value3; }
    = {
        Value1: "Value1",
        Value2: "Value2",
        Value3: "Value3"
    };
}

8)

Aktualizacja: wkrótce po opublikowaniu tego odkryłem inny sposób, ale zapomniałem opublikować aktualizację (jednak ktoś już wspomniał o tym powyżej):

enum MyEnum {
    value1 = <any>"value1 ", 
    value2 = <any>"value2 ", 
    value3 = <any>"value3 " 
}
James Wilkins
źródło
4

Po prostu deklaruję interfejs i używam zmiennej tego typu, aby uzyskać dostęp do wyliczenia. Utrzymanie synchronizacji interfejsu i wyliczania jest w rzeczywistości łatwe, ponieważ TypeScript narzeka, jeśli coś zmienia się w wyliczeniu, tak jak to.

błąd TS2345: Argumentu typu „typeof EAbFlagEnum” nie można przypisać do parametru typu „IAbFlagEnum”. Brak właściwości „Przenieś” w typie „typeof EAbFlagEnum”.

Zaletą tej metody jest to, że rzutowanie typu nie jest wymagane w celu użycia wyliczenia (interfejsu) w różnych sytuacjach, a zatem obsługiwanych jest więcej typów sytuacji, takich jak przełącznik / obudowa.

// Declare a TypeScript enum using unique string 
//  (per hack mentioned by zjc0816)

enum EAbFlagEnum {
  None      = <any> "none",
  Select    = <any> "sel",
  Move      = <any> "mov",
  Edit      = <any> "edit",
  Sort      = <any> "sort",
  Clone     = <any> "clone"
}

// Create an interface that shadows the enum
//   and asserts that members are a type of any

interface IAbFlagEnum {
    None:   any;
    Select: any;
    Move:   any;
    Edit:   any;
    Sort:   any;
    Clone:  any;
}

// Export a variable of type interface that points to the enum

export var AbFlagEnum: IAbFlagEnum = EAbFlagEnum;

Użycie zmiennej zamiast wyliczenia daje pożądane wyniki.

var strVal: string = AbFlagEnum.Edit;

switch (strVal) {
  case AbFlagEnum.Edit:
    break;
  case AbFlagEnum.Move:
    break;
  case AbFlagEnum.Clone
}

Flagi były dla mnie kolejną koniecznością, dlatego stworzyłem moduł NPM, który dodaje się do tego przykładu i zawiera testy.

https://github.com/djabraham/ts-enum-tools

djabraham
źródło
To jedyna znaleziona odpowiedź, która pozwala łączyć definicje z importem. Miły! Możesz użyć export default EAbFlagEnum as IAbFlagEnum;zamiast ponownego tworzenia zmiennej. Usunąłem również <any>obsadę w enum, działa dobrze.
Guillaume F.
4

AKTUALIZACJA: TypeScript 3.4

Możesz po prostu użyć as const:

const AwesomeType = {
   Foo: "foo",
   Bar: "bar"
} as const;

TypeScript 2.1

Można to również zrobić w ten sposób. Mam nadzieję, że to komuś pomoże.

const AwesomeType = {
    Foo: "foo" as "foo",
    Bar: "bar" as "bar"
};

type AwesomeType = (typeof AwesomeType)[keyof typeof AwesomeType];

console.log(AwesomeType.Bar); // returns bar
console.log(AwesomeType.Foo); // returns foo

function doSth(awesometype: AwesomeType) {
    console.log(awesometype);
}

doSth("foo") // return foo
doSth("bar") // returns bar
doSth(AwesomeType.Bar) // returns bar
doSth(AwesomeType.Foo) // returns foo
doSth('error') // does not compile
Łukasz Pniewski
źródło
Właśnie tego potrzebowałem! Obsługuje to, że nazwa klucza różni się od wartości ciągu, jak pokazano z różnicą wielkich / małych liter. Dzięki!
CletusW
2

Dzięki niestandardowym transformatorom ( https://github.com/Microsoft/TypeScript/pull/13940 ), które są dostępne w maszynopisie @ next, możesz tworzyć obiekty podobne do enum z wartościami ciągów z literałów ciągów.

Proszę zajrzeć do mojego pakietu npm, ts-transformer-enumerate .

Przykładowe użycie:

// The signature of `enumerate` here is `function enumerate<T extends string>(): { [K in T]: K };`
import { enumerate } from 'ts-transformer-enumerate';

type Colors = 'green' | 'yellow' | 'red';
const Colors = enumerate<Colors>();

console.log(Colors.green); // 'green'
console.log(Colors.yellow); // 'yellow'
console.log(Colors.red); // 'red'
kimamula
źródło
2

TypeScript <2.4

/** Utility function to create a K:V from a list of strings */
function strEnum<T extends string>(o: Array<T>): {[K in T]: K} {
  return o.reduce((res, key) => {
    res[key] = key;
    return res;
  }, Object.create(null));
}

/**
  * Sample create a string enum
  */

/** Create a K:V */
const Direction = strEnum([
  'North',
  'South',
  'East',
  'West'
])
/** Create a Type */
type Direction = keyof typeof Direction;

/** 
  * Sample using a string enum
  */
let sample: Direction;

sample = Direction.North; // Okay
sample = 'North'; // Okay
sample = 'AnythingElse'; // ERROR!

z https://basarat.gitbooks.io/typescript/docs/types/literal-types.html

Do linku źródłowego można znaleźć więcej i łatwiejszych sposobów uzyskania literału ciągowego

Panagiotis Koursaris
źródło
2

Istnieje wiele odpowiedzi, ale nie widzę żadnych kompletnych rozwiązań. Problem z zaakceptowaną odpowiedzią enum { this, one }polega również na tym , że rozprasza ona wartość ciągu, której używasz w wielu plikach. Nie podoba mi się też „aktualizacja”, jest złożona i nie wykorzystuje też typów. Myślę, że odpowiedź Michaela Bromleya jest jak najbardziej poprawna, ale jego interfejs jest nieco kłopotliwy i może mieć związek z typem.

Używam TypeScript 2.0. * Oto, co bym zrobił

export type Greeting = "hello" | "world";
export const Greeting : { hello: Greeting , world: Greeting } = {
    hello: "hello",
    world: "world"
};

let greet: Greeting = Greeting.hello

Ma również znacznie ładniejsze informacje o typie / najechaniu kursorem, gdy używa się pomocnego IDE. Wadą jest to, że musisz napisać ciągi dwa razy, ale przynajmniej w dwóch miejscach.

Nathan Cooper
źródło
1

Odpowiedź @ basarat była świetna. Oto uproszczony, ale nieco rozszerzony przykład, którego możesz użyć:

export type TMyEnumType = 'value1'|'value2';

export class MyEnumType {
    static VALUE1: TMyEnumType = 'value1';
    static VALUE2: TMyEnumType = 'value2';
}

console.log(MyEnumType.VALUE1); // 'value1'

const variable = MyEnumType.VALUE2; // it has the string value 'value2'

switch (variable) {
    case MyEnumType.VALUE1:
        // code...

    case MyEnumType.VALUE2:
        // code...
}
Manuel Fodor
źródło
1

Ostatnio napotkałem ten problem z TypeScript 1.0.1 i rozwiązałem w ten sposób:

enum IEvents {
        /** A click on a product or product link for one or more products. */
        CLICK,
        /** A view of product details. */
        DETAIL,
        /** Adding one or more products to a shopping cart. */
        ADD,
        /** Remove one or more products from a shopping cart. */
        REMOVE,
        /** Initiating the checkout process for one or more products. */
        CHECKOUT,
        /** Sending the option value for a given checkout step. */
        CHECKOUT_OPTION,
        /** The sale of one or more products. */
        PURCHASE,
        /** The refund of one or more products. */
        REFUND,
        /** A click on an internal promotion. */
        PROMO_CLICK
}

var Events = [
        'click',
        'detail',
        'add',
        'remove',
        'checkout',
        'checkout_option',
        'purchase',
        'refund',
        'promo_click'
];

function stuff(event: IEvents):boolean {
        // event can now be only IEvents constants
        Events[event]; // event is actually a number that matches the index of the array
}
// stuff('click') won't work, it needs to be called using stuff(IEvents.CLICK)
pocesar
źródło
0

Myślę, że powinieneś spróbować z tym, w tym przypadku wartość zmiennej nie zmieni się i działa ona podobnie jak wyliczenia, używanie jak klasy również działa, jedyną wadą jest to, że przez pomyłkę możesz zmienić wartość zmiennej statycznej i właśnie to nie chcemy w wyliczeniach.

namespace portal {

export namespace storageNames {

    export const appRegistration = 'appRegistration';
    export const accessToken = 'access_token';

  }
}
Pranay Dutta
źródło
0
export enum PaymentType {
                Cash = 1,
                Credit = 2
            }
var paymentType = PaymentType[PaymentType.Cash];
Evon Dos
źródło
0
//to access the enum with its string value you can convert it to object 
//then you can convert enum to object with proberty 
//for Example :

enum days { "one" =3, "tow", "Three" }

let _days: any = days;

if (_days.one == days.one)
{ 
    alert(_days.one + ' | ' + _days[4]);
}
Mohammed Rashed Ali
źródło
0

Mały js-hacky, ale działa: e[String(e.hello)]

Majid Mallis
źródło
0

Jeśli to, czego chcesz, to głównie łatwe debugowanie (z uczciwym sprawdzaniem typu) i nie musisz określać specjalnych wartości dla wyliczenia, oto co robię:

export type Enum = { [index: number]: string } & { [key: string]: number } | Object;

/**
 * inplace update
 * */
export function enum_only_string<E extends Enum>(e: E) {
  Object.keys(e)
    .filter(i => Number.isFinite(+i))
    .forEach(i => {
      const s = e[i];
      e[s] = s;
      delete e[i];
    });
}

enum AuthType {
  phone, email, sms, password
}
enum_only_string(AuthType);

Jeśli chcesz obsługiwać przechowywanie starszego kodu / danych, możesz zachować klucze numeryczne.

W ten sposób można uniknąć dwukrotnego wpisywania wartości.

Beeno Tung
źródło
0

Bardzo, bardzo, bardzo proste Enum z ciągiem znaków (TypeScript 2.4)

import * from '../mylib'

export enum MESSAGES {
    ERROR_CHART_UNKNOWN,
    ERROR_2
}

export class Messages {
    public static get(id : MESSAGES){
        let message = ""
        switch (id) {
            case MESSAGES.ERROR_CHART_UNKNOWN :
                message = "The chart does not exist."
                break;
            case MESSAGES.ERROR_2 :
                message = "example."
                break;
        }
        return message
    }
}

function log(messageName:MESSAGES){
    console.log(Messages.get(messageName))
}
Karima Rafes
źródło
0

Próbowałem w TypeScript 1.5 jak poniżej i zadziałało to dla mnie

module App.Constants {
   export enum e{
        Hello= ("Hello") as any,
World= ("World") as any
    }
}
Code-EZ
źródło
0

szukałem sposobu na implementację opisów w wyliczeniach maszynopisu (v2.5) i ten wzór zadziałał dla mnie:

export enum PriceTypes {
    Undefined = 0,
    UndefinedDescription = 'Undefined' as any,
    UserEntered = 1,
    UserEnteredDescription = 'User Entered' as any,
    GeneratedFromTrade = 2,
    GeneratedFromTradeDescription = 'Generated From Trade' as any,
    GeneratedFromFreeze = 3,
    GeneratedFromFreezeDescription = 'Generated Rom Freeze' as any
}

...

    GetDescription(e: any, id: number): string {
        return e[e[id].toString() + "Description"];
    }
    getPriceTypeDescription(price: IPricePoint): string {
        return this.GetDescription(PriceTypes, price.priceType);
    }
Sonic Soul
źródło
-1

TypeScript 0.9.0.1

enum e{
    hello = 1,
    somestr = 'world'
};

alert(e[1] + ' ' + e.somestr);

Plac zabaw TypeScript

Sylvia Plath
źródło
Powstały JavaScript działa, ale to nie produkują błąd kompilatora: Cannot convert 'string' to 'e'..
Sam