Créer une énumération avec des valeurs de chaîne

262

Le code suivant peut être utilisé pour créer un enumdans TypeScript:

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

Et les valeurs sont accessibles par:

e.hello;
e.world;

Comment créer un enumavec des valeurs de chaîne?

enum e {
    hello = "hello", // error: cannot convert string to e
    world = "world"  // error 
};
FacePalm
la source
dirige les types Singleton sous la forme de types littéraux de chaînes # 1003 devrait résoudre ce problème
Andreas Frische

Réponses:

409

TypeScript 2.4

A maintenant des énumérations de chaînes pour que votre code fonctionne juste:

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

🌹

TypeScript 1.8

Depuis TypeScript 1.8, vous pouvez utiliser des types littéraux de chaîne pour fournir une expérience fiable et sûre pour les valeurs de chaîne nommées (ce qui est en partie pour quoi les énumérations sont utilisées).

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

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

Support hérité

Les énumérations dans TypeScript sont basées sur des nombres.

Vous pouvez cependant utiliser une classe avec des membres statiques:

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

Vous pouvez aussi vous expliquer:

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

Mise à jour: basé sur l'exigence de pouvoir faire quelque chose comme var test:E = E.hello;ce qui suit satisfait à ceci:

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
la source
Petite amélioration:toString(): string { return this.value; }
psulek
@psulek En fait, typescript déduira que toStringrenvoie une chaîne car elle renvoie this.valueet valueest de type chaîne. Donc, vous ne pouvez pas le faire var x:number = E.hello.toString();et si vous le faites, var x = E.hello.toString();x est également supposé être de type string:)
basarat
2
@BASarat C'est vrai que le tapuscrit gère un tel cas, mais je veux avoir toujours des méthodes décorées avec des types de retour chaque fois que nous le savons, même ce n'est pas nécessaire pour le compilateur ts, mais pour nous les codeurs de savoir quand nous avons vu la définition de la méthode tapez-le retourne.
psulek
@basarat y a-t-il un inconvénient à remplacer la get()méthode par return this.value? De cette façon, il retournera la valeur de la chaîne à chaque accès et pas seulement lors de la conversion toString().
John
@basarat Si vous avez plusieurs "énumérations" comme ça, le compilateur ne les distinguera pas à cause du typage structurel - le compilateur verra les valuemembres sur tous les types et les traitera comme des types comparables. Vous pouvez cependant rendre le valuemembre privé. De cette façon, le compilateur ne le verra pas et n'essaiera pas d'appliquer le typage structurel.
Kirill G.3
113

Dans la dernière version (1.0RC) de TypeScript, vous pouvez utiliser des énumérations comme ceci:

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

Mise à jour 1

Pour obtenir la valeur numérique du membre enum à partir de la valeur de chaîne, vous pouvez utiliser ceci:

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

Update 2

Dans le dernier TypeScript 2.4, des énumérations de chaînes ont été introduites, comme ceci:

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

    // Aliases
    RemoveUser = DeleteUser,
}

Pour plus d'informations sur TypeScript 2.4, lisez le blog sur MSDN .

psulek
la source
2
Généralement, cette solution est préférée (car c'est une véritable énumération), mais vous êtes très limité sur le nom de l'énumération (d'où la «chaîne»).
JasonS
2
Meilleure solution à ce jour.
Alon Amir
2
Quelque chose de nouveau à ce sujet? Parce que States[str]ça ne marche plus de nos jours. Type 'string' is not assignable to type 'States'
MrCroft
1
@MrCroft Vous pouvez utiliser: States[str as any]à faire dans la version actuelle (2.x) de Typescript.
psulek
États [str] est ce que je cherchais. Merci!
Martin Konicek
81

TypeScript 2.4+

Vous pouvez désormais affecter des valeurs de chaîne directement aux membres d'énumération:

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

Voir # 15486 pour plus d'informations.

TypeScript 1.8+

Dans TypeScript 1.8+, vous pouvez créer un type littéral de chaîne pour définir le type et un objet du même nom pour la liste de valeurs. Il imite le comportement attendu d'une énumération de chaînes.

Voici un exemple:

type MyStringEnum = "member1" | "member2";

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

Qui fonctionnera comme une énumération de chaînes:

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

Assurez-vous de taper toutes les chaînes de l'objet! Si vous ne le faites pas, dans le premier exemple ci-dessus, la variable ne serait pas implicitement tapée MyStringEnum.

David Sherret
la source
1
Comment puis-je définir quelque chose de similaire dans un fichier de déclaration?
Zev Spitz
@ZevSpitz vous pouvez faire ce
David Sherret
Il convient de noter qu'avec le compilateur actuel, vous pouvez mal saisir les valeurs de chaîne dans MyStringEnum et il ne se plaindra pas. J'ai créé une interface «Enforcer» pour m'assurer que mes chaînes sont toujours valides. Par exemple: interface MyStringEnumEnforcer {Member1: MyStringEnum, Member2: MyStringEnum} Puis const MyStringEnum: MyStringEnumEnforcer = {Member1: "member1", Member2: "member2"} Cela n'autorise pas les chaînes mal typées, bien que le compilateur puisse finir par travailler pour votre scénario original finalement. Il y a beaucoup de cérémonie avec cette approche mais j'aime la sécurité.
jmorc
40

Dans TypeScript 0.9.0.1, bien qu'il se produise une erreur de compilation, le compilateur peut toujours compiler le fichier ts dans le fichier js. Le code fonctionne comme prévu et Visual Studio 2012 peut prendre en charge la complétion automatique du code.

Mettre à jour :

En syntaxe, TypeScript ne nous permet pas de créer une énumération avec des valeurs de chaîne, mais nous pouvons pirater le compilateur: 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']);

Terrain de jeux

MINATO Azuma
la source
1
Bon hack, mais vous ne pouvez pas utiliser ces énumérations / constantes dans une instruction switch, par exemple case Link.LEARN:, vous obtiendrez une Cannot convert 'Link.LEARN' to 'string'erreur de génération. Le casting ne fonctionnera pas.
Fin du codage le
@TrueBlueAussie Cela semble fonctionner correctement pour moi en exécutant TSC 1.0.0.0. De plus, si, pour une raison quelconque, vous devez mettre une constante / variable de chaîne dans l'instruction case, cela fonctionnera si vous la convertissez en n'importe quelle.
CodeAndCats
1
Aussi, merci @ zjc0816, j'aime vraiment cette solution :)
CodeAndCats
c'est la solution que je voulais.
Murhaf Sousli
5
C'est drôle, je me demande pourquoi TypeScript ne supporte pas seulement les chaînes d'énumération déjà ... Beaucoup de gens le veulent (moi inclus).
Hendy Irawan
23

TypeScript 2.1 +

Les types de recherche , introduits dans TypeScript 2.1, permettent un autre modèle pour simuler les énumérations de chaînes:

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

Avec la version 2.4, TypeScript a introduit la prise en charge native des énumérations de chaînes, de sorte que la solution ci-dessus n'est pas nécessaire. Depuis les documents TS:

enum Colors {
  Red = "RED",
  Green = "GREEN",
  Blue = "BLUE",
}
Michael Bromley
la source
Comment pourrais-je faire cela si le nom de la clé enum est différent de la valeur de la chaîne (car elle est très longue, par exemple)?
CletusW
Ça ne fait rien! Résolu dans la réponse de @ Łukasz-pniewski ci-dessous stackoverflow.com/a/42820134/1431146
CletusW
tslint générera une erreur sur cet exemple String-Enum lors d'une tentative de mappage inversé de l'élément Enum: Element ayant implicitement un type 'any' car l'expression d'index n'est pas de type 'number'. Je suppose que le problème est que, dans les chaînes TS, les énumérations ne peuvent pas être mappées en sens inverse, voir le commentaire dans l'exemple String-Enum à typescriptlang.org/docs/handbook/release-notes/… - Cela semble être vrai pour TS 2.4 où String-Enum a été introduit mais j'obtiens également l'erreur dans TS 2.6.2. Exemple: Colors["RED"]ne fonctionnera pas. Toute idée de comment résoudre ce problème (requis pour la conversion JSON).
masi
19

Pourquoi ne pas simplement utiliser la manière native d'accéder aux chaînes d'une énumération.

enum e {
  WHY,
  NOT,
  USE,
  NATIVE
}

e[e.WHY] // this returns string 'WHY'
Mient-jan Stelling
la source
2
C'est la réponse que je cherchais, merci! Les autres solutions sont des solutions de contournement intelligentes, mais c'est si simple :)
M--
19
Cela ne répond pas à la question. La question ne concerne pas l'accès aux chaînes d'une énumération. enum Why { Because = "You Can't", Always = "Do Things That Way." };)
James Wilkins
Il y a des problèmes lors de l'utilisation d'énumérations de valeurs numériques, telles que 0 étant faux, plus difficile à déboguer, etc.
robmcm
@robmcm résolu enum e {POURQUOI = 1, PAS = 2, UTILISATION = 3, NATIF = 4} e [e.POURQUOI] // ceci renvoie la chaîne 'POURQUOI'
Mient-jan Stelling
16

Vous pouvez utiliser des énumérations de chaînes dans le dernier TypeScript:

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

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


MISE À JOUR - 2016

Une façon légèrement plus robuste de créer un ensemble de chaînes que j'utilise pour React ces jours-ci est la suivante:

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
la source
1
C'était la manière la plus concise qui a fait le travail pour moi ... Au moins jusqu'à ce que je puisse comprendre comment mettre à jour mon échafaudage pour compiler avec TS 1.8
ThinkBonobo
Cependant, un problème avec cela est qu'il <string>e.hellodéclenche une erreur. e.helloest toujours considéré comme un nombre par le compilateur. <number>e.hellofonctionne bien. Y a-t-il un moyen de contourner cela? Tout ce à quoi je peux penser, c'est <string><any>e.hello.
RainingChain
Un autre problème est lorsque le fait d'avoir un membre enum est égal à la valeur enum. Ex:enum Test { a = <any>"b", b = <any>"c", c = <any>"a" } Test.a === 'c'
RainingChain
J'utilise cette méthode tout le temps. Rock enum's rock. Il est décevant que le compilateur n'ait pas de support de première classe pour les littéraux de chaîne, mais il a un support de 2e classe. Le compilateur sait réellement quand vous avez utilisé le hack <any> car cela vous empêchera de l'utiliser dans un fichier .d.ts - cela me donne une certaine légitimité à l'utilisation de ce "hack" puisque le compilateur est évidemment au courant mais ne l'arrête pas complètement.
CodeAndCats
Btw, si vous voulez comparer une valeur de chaîne avec une valeur d'énumération de chaîne, plutôt que de transtyper en <any>puis en <string>, faites simplement:someStringValue == someEnumValue.toString()
CodeAndCats
10

Voici une solution assez propre qui permet l'héritage, en utilisant TypeScript 2.0. Je n'ai pas essayé cela sur une version antérieure.

Bonus: la valeur peut être de tout type!

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
la source
1
Très bonne réponse! Je luttais pour créer un objet semblable à Enum avec un support d'héritage.
DanielM
Un exemple utilisant une énumération basée sur une classe: goo.gl/SwH4zb (lien vers la cour de récréation de TypeScript).
DanielM
8

Un moyen hacky pour cela est: -

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

Comment utiliser

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

Cela fonctionne pour moi:

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

ou

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

8)

Mise à jour: Peu de temps après avoir posté cela, j'ai découvert une autre façon, mais j'ai oublié de publier une mise à jour (cependant, quelqu'un l'a déjà mentionné ci-dessus):

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

Je déclare simplement une interface et j'utilise une variable de ce type pour accéder à l'énumération. Garder l'interface et l'énumération synchronisées est en fait facile, car TypeScript se plaint si quelque chose change dans l'énumération, ainsi.

erreur TS2345: l'argument de type «typeof EAbFlagEnum» n'est pas attribuable au paramètre de type «IAbFlagEnum». La propriété «Move» est manquante dans le type «typeof EAbFlagEnum».

L'avantage de cette méthode est qu'aucune conversion de type n'est requise pour utiliser l'énumération (interface) dans diverses situations, et plusieurs types de situations sont ainsi pris en charge, tels que le commutateur / boîtier.

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

L'utilisation de la variable, plutôt que de l'énumération, produit les résultats souhaités.

var strVal: string = AbFlagEnum.Edit;

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

Les indicateurs étaient une autre nécessité pour moi, j'ai donc créé un module NPM qui s'ajoute à cet exemple et inclut des tests.

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

djabraham
la source
C'est la seule réponse que j'ai trouvée qui permette de mélanger les définitions avec les importations. Agréable! Vous pouvez utiliser export default EAbFlagEnum as IAbFlagEnum;au lieu de redéclarer une variable. J'ai également supprimé le <any>casting dans l'énumération, cela fonctionne bien.
Guillaume F.
4

MISE À JOUR: TypeScript 3.4

Vous pouvez simplement utiliser as const:

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

TypeScript 2.1

Cela peut également être fait de cette façon. J'espère que cela aidera quelqu'un.

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
la source
C'est exactement ce dont j'avais besoin! Il prend en charge le fait que le nom de la clé soit différent de la valeur de la chaîne, comme vous l'avez montré avec votre différence majuscule / minuscule. Merci!
CletusW
2

Avec des transformateurs personnalisés ( https://github.com/Microsoft/TypeScript/pull/13940 ) qui sont disponibles dans typescript @ next, vous pouvez créer un objet de type énumération avec des valeurs de chaîne à partir de types littéraux de chaîne.

Veuillez consulter mon package npm, ts-transformer-enumerate .

Exemple d'utilisation:

// 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
la source
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!

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

Vers le lien source, vous pouvez trouver des moyens plus nombreux et plus faciles d'accomplir le type littéral de chaîne

Panagiotis Koursaris
la source
2

Il y a beaucoup de réponses, mais je ne vois pas de solutions complètes. Le problème avec la réponse acceptée, ainsi que enum { this, one }, est qu'elle disperse la valeur de chaîne que vous utilisez à travers de nombreux fichiers. Je n'aime pas vraiment non plus la "mise à jour", elle est complexe et ne tire pas aussi parti des types. Je pense que la réponse de Michael Bromley est la plus correcte, mais son interface est un peu compliquée et pourrait faire avec un type.

J'utilise TypeScript 2.0. * Voici ce que je ferais

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

let greet: Greeting = Greeting.hello

Il a également des informations de type / survol beaucoup plus agréables lors de l'utilisation d'un IDE utile. L'inconvénient est que vous devez écrire les chaînes deux fois, mais au moins ce n'est qu'à deux endroits.

Nathan Cooper
la source
1

La réponse de @ basarat était excellente. Voici un exemple simplifié mais un peu étendu que vous pouvez utiliser:

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
la source
1

Face à ce problème récemment avec TypeScript 1.0.1, et résolu de cette façon:

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
la source
0

Je pense que vous devriez essayer avec cela, dans ce cas, la valeur de la variable ne changera pas et cela fonctionne tout à fait comme des énumérations, l'utilisation comme une classe fonctionne également le seul inconvénient est que par erreur, vous pouvez modifier la valeur de la variable statique et c'est ce que nous ne voulons pas d'énumérations.

namespace portal {

export namespace storageNames {

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

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

Petit js-hacky mais fonctionne: e[String(e.hello)]

Majid Mallis
la source
0

Si ce que vous voulez est principalement un débogage facile (avec une vérification de type assez) et que vous n'avez pas besoin de spécifier des valeurs spéciales pour l'énumération, voici ce que je fais:

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 vous souhaitez prendre en charge le stockage de code / données hérité, vous pouvez conserver les touches numériques.

De cette façon, vous pouvez éviter de taper deux fois les valeurs.

Beeno Tung
la source
0

Enum très, très, très simple avec chaîne (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
la source
0

J'ai essayé dans TypeScript 1.5 comme ci-dessous et cela a fonctionné pour moi

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

je cherchais un moyen d'implémenter des descriptions dans des énumérations dactylographiées (v2.5) et ce modèle a fonctionné pour moi:

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
la source
-1

TypeScript 0.9.0.1

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

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

Aire de jeux TypeScript

Sylvia Plath
la source
Le JavaScript résultant fonctionne, mais cela ne produit une erreur de compilation: Cannot convert 'string' to 'e'..
Sam