Crear una enumeración con valores de cadena

262

El siguiente código se puede usar para crear un enumen TypeScript:

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

Y se puede acceder a los valores mediante:

e.hello;
e.world;

¿Cómo creo un enumcon valores de cadena?

enum e {
    hello = "hello", // error: cannot convert string to e
    world = "world"  // error 
};
FacePalm
fuente
dirige tipos Singleton bajo la forma de tipos literales de cadena # 1003 debería resolver esto
Andreas Frische

Respuestas:

409

TypeScript 2.4

Ahora tiene enumeraciones de cadena, por lo que su código simplemente funciona:

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

🌹

TypeScript 1.8

Desde TypeScript 1.8 puede usar tipos literales de cadena para proporcionar una experiencia confiable y segura para valores de cadena con nombre (que es en parte para lo que se utilizan las enumeraciones).

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

Más : https://www.typescriptlang.org/docs/handbook/advanced-types.html#string-literal-types

Soporte heredado

Las enumeraciones en TypeScript están basadas en números.

Sin embargo, puede usar una clase con miembros estáticos:

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

También puedes ir simple:

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

Actualización: según el requisito de poder hacer algo como var test:E = E.hello;lo siguiente, esto satisface:

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
fuente
Pequeña mejora:toString(): string { return this.value; }
psulek
@psulek En realidad, el mecanografiado inferirá que toStringdevuelve una cadena, ya que devuelve this.valuey valuees de tipo cadena. Por lo tanto, no puede hacerlo var x:number = E.hello.toString();y si lo hace, var x = E.hello.toString();x también se considera que es de tipo string:)
basarat
2
@BASarat Esto es cierto que el mecanografiado maneja ese caso, pero quiero decir que siempre he tenido métodos decorados con tipos de retorno cada vez que lo conocemos, incluso no es necesario para el compilador ts, pero para nosotros los codificadores saber cuándo vimos la definición del método escribirlo devuelve.
psulek
@basarat ¿Hay algún inconveniente en reemplazar el get()método return this.value? De esa manera, devolverá el valor de la cadena cada vez que se acceda y no solo al convertir toString().
John
@basarat Si tiene varias "enumeraciones" como esa, el compilador no distinguirá entre ellas debido a la tipificación estructural: el compilador verá valuemiembros en todos los tipos y los tratará como tipos comparables. Sin embargo, puede hacer que el valuemiembro sea privado. De esta forma, el compilador no lo verá y no intentará aplicar la tipificación estructural.
Kirill G.
113

En la última versión (1.0RC) de TypeScript, puede usar enumeraciones como esta:

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

Actualización 1

Para obtener el valor numérico del miembro enum del valor de cadena, puede usar esto:

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

Actualización 2

En el último TypeScript 2.4, se introdujeron enumeraciones de cadena, como esta:

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

    // Aliases
    RemoveUser = DeleteUser,
}

Para obtener más información sobre TypeScript 2.4, lea el blog en MSDN .

psulek
fuente
2
En general, se prefiere esta solución (ya que es una enumeración real), sin embargo, está muy limitado sobre cuál es el nombre de la enumeración (de ahí la 'cadena').
JasonS
2
La mejor solución a partir de hoy.
Alon Amir
2
¿Algo nuevo sobre esto? Porque States[str]no funciona hoy en día. Type 'string' is not assignable to type 'States'
MrCroft
1
@ MrCroft Puede usar: States[str as any]para hacer en la versión actual (2.x) de Typecript.
psulek
States [str] es lo que estaba buscando. ¡Gracias!
Martin Konicek
81

TypeScript 2.4+

Ahora puede asignar valores de cadena directamente a los miembros de enumeración:

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

Ver # 15486 para más información.

TypeScript 1.8+

En TypeScript 1.8+, puede crear un tipo literal de cadena para definir el tipo y un objeto con el mismo nombre para la lista de valores. Imita el comportamiento esperado de una cadena de enumeración.

Aquí hay un ejemplo:

type MyStringEnum = "member1" | "member2";

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

Que funcionará como un enum de cadena:

// 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

¡Asegúrese de escribir todas las cadenas en el objeto! Si no lo hace, en el primer ejemplo anterior, la variable no se escribiría implícitamente MyStringEnum.

David Sherret
fuente
1
¿Cómo puedo definir algo similar en un archivo de declaración?
Zev Spitz
@ZevSpitz puedes hacer esto
David Sherret
Vale la pena señalar que con el compilador actual, puede escribir incorrectamente los valores de cadena en MyStringEnum y no se quejará. He estado creando una interfaz 'Enforcer' para asegurarme de que mis cadenas sean siempre válidas. Por ejemplo: interfaz MyStringEnumEnforcer {Miembro1: MyStringEnum, Miembro2: MyStringEnum} Luego const MyStringEnum: MyStringEnumEnforcer = {Miembro1: "miembro1", Miembro2: "miembro2"} Esto no permite cadenas mal escritas, aunque el compilador puede terminar trabajando para su escenario original eventualmente. Hay mucha ceremonia con este enfoque, pero me gusta la seguridad.
jmorc
40

En TypeScript 0.9.0.1, aunque se produce un error del compilador, el compilador aún puede compilar el archivo ts en el archivo js. El código funciona como esperábamos y Visual Studio 2012 puede admitir la finalización automática del código.

Actualización:

En sintaxis, TypeScript no nos permite crear una enumeración con valores de cadena, pero podemos hackear el compilador: 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']);

Patio de recreo

MINATO Azuma
fuente
1
Buen truco, pero no puede usar estas enumeraciones / constantes en una declaración de cambio, por ejemplo case Link.LEARN:, obtendrá un Cannot convert 'Link.LEARN' to 'string'error de compilación. El casting no funcionará.
Se fue la codificación el
@TrueBlueAussie Esto parece funcionar bien para mí ejecutando TSC 1.0.0.0. Además, si por alguna razón necesita poner una cadena constante / variable en la declaración de caso, funcionará si la convierte en alguna.
CodeAndCats
1
Además, gracias @ zjc0816, me encanta esta solución :)
CodeAndCats
Esa es la solución que quería.
Murhaf Sousli
55
Es curioso, me pregunto por qué TypeScript ya no solo admite cadenas de enumeración ... Mucha gente quiere esto (incluido yo).
Hendy Irawan
23

TypeScript 2.1 +

Los tipos de búsqueda , introducidos en TypeScript 2.1, permiten otro patrón para simular enumeraciones de cadenas:

// 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 +

Con la versión 2.4, TypeScript introdujo el soporte nativo para las enumeraciones de cadenas, por lo que la solución anterior no es necesaria. De los documentos de TS:

enum Colors {
  Red = "RED",
  Green = "GREEN",
  Blue = "BLUE",
}
Michael Bromley
fuente
¿Cómo haría esto si el nombre de la clave enum es diferente del valor de la cadena (porque es muy largo, por ejemplo)?
CletusW
¡No importa! Resuelto en la respuesta de @ Łukasz-pniewski a continuación stackoverflow.com/a/42820134/1431146
CletusW
tslint arrojará un error en ese ejemplo de String-Enum cuando intente hacer un mapa inverso de Enum: Element tiene implícitamente un tipo 'any' porque la expresión de índice no es del tipo 'number'. Supongo que el problema es que en las cadenas de TS Enums no se puede asignar en reversa, vea el comentario en el ejemplo de String-Enum en typescriptlang.org/docs/handbook/release-notes/… - Esto parece ser cierto para TS 2.4 donde Se introdujo String-Enum pero también recibo el error en TS 2.6.2. Ejemplo: Colors["RED"]no funcionará. Alguna idea de cómo resolver esto (requerido para la conversión JSON).
masi
19

¿Por qué no utilizar la forma nativa de acceder a las cadenas de una enumeración?

enum e {
  WHY,
  NOT,
  USE,
  NATIVE
}

e[e.WHY] // this returns string 'WHY'
Mient-jan Stelling
fuente
2
Esta es la respuesta que estaba buscando, ¡gracias! Las otras soluciones son soluciones ingeniosas, pero esto es muy simple :)
M--
19
Esto no responde la pregunta. La pregunta no es sobre el acceso a las cadenas de una enumeración. enum Why { Because = "You Can't", Always = "Do Things That Way." };)
James Wilkins
Hay problemas cuando se utiliza enumeraciones valor numérico, como por ejemplo 0, siendo Falsy más difícil de depurar, etc
robmcm
@robmcm resuelto enum e {POR QUÉ = 1, NO = 2, USO = 3, NATIVO = 4} e [e.WHY] // esto devuelve la cadena 'POR QUÉ'
Mient-jan Stelling
16

Puede usar enumeraciones de cadenas en el último TypeScript:

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

Fuente: https://blog.rsuter.com/how-to-implement-an-enum-with-string-values-in-typescript/


ACTUALIZACIÓN - 2016

Una forma un poco más robusta de hacer un conjunto de cadenas que utilizo para React en estos días es así:

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);
Ricardo
fuente
1
Esta fue la forma más concisa que hizo el trabajo para mí ... Al menos hasta que pueda encontrar la manera de actualizar mi andamio para compilar con TS 1.8
ThinkBonobo
Sin embargo, un problema con esto es que <string>e.hellodesencadena un error. e.hellotodavía es considerado como un número por el compilador. <number>e.hellofunciona sin embargo. ¿Hay alguna forma de evitar esto? Todo lo que puedo pensar es <string><any>e.hello.
RainingChain
Otro problema es cuando tener un miembro enum es igual al valor enum. Ej:enum Test { a = <any>"b", b = <any>"c", c = <any>"a" } Test.a === 'c'
RainingChain
Yo uso este método todo el tiempo. String enum's rock. Es decepcionante que el compilador no tenga soporte de primera clase para literales de cadena, pero sí tiene soporte de segunda clase. El compilador realmente sabe cuándo ha usado el <any> hack, ya que le impedirá usarlo en un archivo .d.ts, lo que para mí le da cierta legitimidad al uso de este "hack" ya que el compilador obviamente es consciente pero no lo detiene por completo.
CodeAndCats
Por cierto, si desea comparar un valor de cadena con un valor de enumeración de cadena, en lugar de <any><string>someStringValue == someEnumValue.toString()
convertir
10

Aquí hay una solución bastante limpia que permite la herencia, usando TypeScript 2.0. No probé esto en una versión anterior.

Prima: el valor puede ser de cualquier tipo!

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
fuente
1
¡Gran respuesta! Estaba luchando por hacer algún objeto similar a Enum con soporte de herencia.
DanielM
Un ejemplo que usa una enumeración basada en clases: goo.gl/SwH4zb (enlace al patio de juegos de TypeScript).
DanielM
8

Una manera hacky de esto es: -

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]];
}

Cómo utilizar

Utils.getEnumString(Status, Status.COMPLETED); // = "COMPLETED"
nishantkyal
fuente
7

Esto funciona para mi:

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

o

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

8)

Actualización: poco después de publicar esto descubrí otra forma, pero olvidé publicar una actualización (sin embargo, alguien ya lo mencionó anteriormente):

enum MyEnum {
    value1 = <any>"value1 ", 
    value2 = <any>"value2 ", 
    value3 = <any>"value3 " 
}
James Wilkins
fuente
4

Acabo de declarar una interfaz y uso una variable de ese tipo para acceder a la enumeración. Mantener la interfaz y la enumeración sincronizadas es realmente fácil, ya que TypeScript se queja si algo cambia en la enumeración, así.

error TS2345: El argumento del tipo 'typeof EAbFlagEnum' no se puede asignar al parámetro del tipo 'IAbFlagEnum'. Falta la propiedad 'Move' en el tipo 'typeof EAbFlagEnum'.

La ventaja de este método es que no se requiere conversión de tipos para usar la enumeración (interfaz) en diversas situaciones, y por lo tanto, se admiten más tipos de situaciones, como el interruptor / caso.

// 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;

El uso de la variable, en lugar de la enumeración, produce los resultados deseados.

var strVal: string = AbFlagEnum.Edit;

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

Las banderas eran otra necesidad para mí, así que creé un módulo NPM que se suma a este ejemplo e incluye pruebas.

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

djabraham
fuente
Esta es la única respuesta que encontré que permite mezclar definiciones con importaciones. ¡Agradable! Puede usar en export default EAbFlagEnum as IAbFlagEnum;lugar de redeclarar una variable. También eliminé el <any>yeso en la enumeración, funciona bien.
Guillaume F.
4

ACTUALIZACIÓN: TypeScript 3.4

Simplemente puede usar as const:

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

TypeScript 2.1

Esto también se puede hacer de esta manera. Espero que ayude a alguien.

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
fuente
¡Esto es exactamente lo que necesitaba! Admite que el nombre de la clave sea diferente del valor de la cadena, como lo ha mostrado con su diferencia en mayúsculas / minúsculas. ¡Gracias!
CletusW
2

Con transformadores personalizados ( https://github.com/Microsoft/TypeScript/pull/13940 ) que está disponible en typescript @ next, puede crear una enumeración como objeto con valores de cadena de tipos literales de cadena.

Por favor revise mi paquete npm, ts-transformer-enumerate .

Ejemplo de uso:

// 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
fuente
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!

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

Para el enlace de origen, puede encontrar formas más y más fáciles de lograr el tipo literal de cadena

Panagiotis Koursaris
fuente
2

Hay muchas respuestas, pero no veo ninguna solución completa. El problema con la respuesta aceptada, así como también enum { this, one }, es que dispersa el valor de cadena que está utilizando a través de muchos archivos. Realmente tampoco me gusta la "actualización", es compleja y no aprovecha los tipos también. Creo que la respuesta de Michael Bromley es muy correcta, pero su interfaz es un poco molesta y podría funcionar con un tipo.

Estoy usando TypeScript 2.0. * Esto es lo que haría

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

let greet: Greeting = Greeting.hello

También tiene información mucho mejor sobre el tipo / desplazamiento al usar un IDE útil. El inconveniente es que tienes que escribir las cadenas dos veces, pero al menos solo está en dos lugares.

Nathan Cooper
fuente
1

La respuesta de @basarat fue genial. Aquí está un ejemplo simplificado pero un poco extendido que puede usar:

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
fuente
1

Enfrenté este problema recientemente con TypeScript 1.0.1 y lo resolvió de esta manera:

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
fuente
0

Creo que deberías intentar con esto, en este caso el valor de la variable no cambiará y funciona como enums, usar como una clase también funciona, la única desventaja es que por error puedes cambiar el valor de la variable estática y eso es lo que No queremos en enumeraciones.

namespace portal {

export namespace storageNames {

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

  }
}
Pranay Dutta
fuente
0
export enum PaymentType {
                Cash = 1,
                Credit = 2
            }
var paymentType = PaymentType[PaymentType.Cash];
Evon Dos
fuente
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
fuente
0

Pequeño js-hacky pero funciona: e[String(e.hello)]

Majid Mallis
fuente
0

Si lo que desea es principalmente una depuración fácil (con una verificación de tipo bastante) y no necesita especificar valores especiales para la enumeración, esto es lo que estoy haciendo:

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

Si desea admitir el almacenamiento de código / datos heredados, puede conservar las teclas numéricas.

De esta manera, puede evitar escribir los valores dos veces.

Beeno Tung
fuente
0

Muy, muy, muy simple Enum con cadena (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
fuente
0

He intentado en TypeScript 1.5 como a continuación y me ha funcionado

module App.Constants {
   export enum e{
        Hello= ("Hello") as any,
World= ("World") as any
    }
}
Code-EZ
fuente
0

Estaba buscando una manera de implementar descripciones en enumeraciones mecanografiadas (v2.5) y este patrón funcionó para mí:

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);
    }
Alma sónica
fuente
-1

TypeScript 0.9.0.1

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

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

Zona de juegos de TypeScript

Sylvia Plath
fuente
El código JavaScript resultante funciona, pero esto no produce un error de compilación: Cannot convert 'string' to 'e'..
Sam