Le code suivant peut être utilisé pour créer un enum
dans TypeScript:
enum e {
hello = 1,
world = 2
};
Et les valeurs sont accessibles par:
e.hello;
e.world;
Comment créer un enum
avec des valeurs de chaîne?
enum e {
hello = "hello", // error: cannot convert string to e
world = "world" // error
};
typescript
FacePalm
la source
la source
Réponses:
TypeScript 2.4
A maintenant des énumérations de chaînes pour que votre code fonctionne juste:
🌹
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).
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:
Vous pouvez aussi vous expliquer:
Mise à jour: basé sur l'exigence de pouvoir faire quelque chose comme
var test:E = E.hello;
ce qui suit satisfait à ceci:la source
toString(): string { return this.value; }
toString
renvoie une chaîne car elle renvoiethis.value
etvalue
est de type chaîne. Donc, vous ne pouvez pas le fairevar x:number = E.hello.toString();
et si vous le faites,var x = E.hello.toString();
x est également supposé être de typestring
:)get()
méthode parreturn this.value
? De cette façon, il retournera la valeur de la chaîne à chaque accès et pas seulement lors de la conversiontoString()
.value
membres sur tous les types et les traitera comme des types comparables. Vous pouvez cependant rendre levalue
membre privé. De cette façon, le compilateur ne le verra pas et n'essaiera pas d'appliquer le typage structurel.Dans la dernière version (1.0RC) de TypeScript, vous pouvez utiliser des énumérations comme ceci:
Mise à jour 1
Pour obtenir la valeur numérique du membre enum à partir de la valeur de chaîne, vous pouvez utiliser ceci:
Update 2
Dans le dernier TypeScript 2.4, des énumérations de chaînes ont été introduites, comme ceci:
Pour plus d'informations sur TypeScript 2.4, lisez le blog sur MSDN .
la source
States[str]
ça ne marche plus de nos jours.Type 'string' is not assignable to type 'States'
States[str as any]
à faire dans la version actuelle (2.x) de Typescript.TypeScript 2.4+
Vous pouvez désormais affecter des valeurs de chaîne directement aux membres d'énumération:
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:
Qui fonctionnera comme une énumération de chaînes:
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
.la source
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
Terrain de jeux
la source
case Link.LEARN:
, vous obtiendrez uneCannot convert 'Link.LEARN' to 'string'
erreur de génération. Le casting ne fonctionnera pas.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:
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:
la source
Colors["RED"]
ne fonctionnera pas. Toute idée de comment résoudre ce problème (requis pour la conversion JSON).Pourquoi ne pas simplement utiliser la manière native d'accéder aux chaînes d'une énumération.
la source
enum Why { Because = "You Can't", Always = "Do Things That Way." }
;)Vous pouvez utiliser des énumérations de chaînes dans le dernier TypeScript:
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:
la source
<string>e.hello
déclenche une erreur.e.hello
est toujours considéré comme un nombre par le compilateur.<number>e.hello
fonctionne bien. Y a-t-il un moyen de contourner cela? Tout ce à quoi je peux penser, c'est<string><any>e.hello
.enum Test { a = <any>"b", b = <any>"c", c = <any>"a" }
Test.a === 'c'
<any>
puis en<string>
, faites simplement:someStringValue == someEnumValue.toString()
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!
la source
Un moyen hacky pour cela est: -
CallStatus.ts
Utils.ts
Comment utiliser
la source
Cela fonctionne pour moi:
ou
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):
la source
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.
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.
L'utilisation de la variable, plutôt que de l'énumération, produit les résultats souhaités.
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
la source
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.MISE À JOUR: TypeScript 3.4
Vous pouvez simplement utiliser
as const
:TypeScript 2.1
Cela peut également être fait de cette façon. J'espère que cela aidera quelqu'un.
la source
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:
la source
TypeScript <2,4
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
la source
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
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.
la source
La réponse de @ basarat était excellente. Voici un exemple simplifié mais un peu étendu que vous pouvez utiliser:
la source
Face à ce problème récemment avec TypeScript 1.0.1, et résolu de cette façon:
la source
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.
la source
la source
la source
Petit js-hacky mais fonctionne:
e[String(e.hello)]
la source
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:
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.
la source
Enum très, très, très simple avec chaîne (TypeScript 2.4)
la source
J'ai essayé dans TypeScript 1.5 comme ci-dessous et cela a fonctionné pour moi
la source
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:
...
la source
TypeScript 0.9.0.1
Aire de jeux TypeScript
la source
Cannot convert 'string' to 'e'.
.