J'ai défini l'énumération suivante dans TypeScript:
enum Color{
Red, Green
}
Maintenant, dans ma fonction, je reçois la couleur sous forme de chaîne. J'ai essayé le code suivant:
var green= "Green";
var color : Color = <Color>green; // Error: can't convert string to enum
Comment puis-je convertir cette valeur en une énumération?
typescript
Amitabh
la source
la source
--noImplicitAny
(dans VS non coché "Autoriser les types 'any' implicites"). Il produiterror TS7017: Index signature of object type implicitly has an 'any' type.
Pour moi, cela a fonctionné:var color: Color = (<any>Color)[green];
(testé avec la version 1.4)var color : Color = Color[green as keyof typeof Color];
À partir de Typescript 2.1, les clés de chaîne dans les énumérations sont fortement typées.
keyof typeof
est utilisé pour obtenir des informations sur les clés de chaîne disponibles ( 1 ):https://www.typescriptlang.org/docs/handbook/advanced-types.html#index-types
la source
let s = "Green"; let typedColor = <keyof typeof Color> s;
let
parconst
fonctionnera sans lancer. Exemple mis à jour pour clarifier cela. Merci @SergeyTtypedColorString = Color["Black"];
revient maintenanterror TS7015: Element implicitly has an 'any' type because index expression is not of type 'number'
const color: Color = Color[colorString as keyof typeof Color];
Si vous êtes sûr qu'une chaîne d'entrée a une correspondance exacte avec Color enum, utilisez:
Dans le cas où une chaîne d'entrée peut ne pas correspondre à Enum, utilisez:
Terrain de jeux
Si nous ne la chassez
enum
à<any>
taper alors tapuscrit affiche l'erreur:Cela signifie que par défaut, le type Enum TypeScript fonctionne avec les index numériques, c'est
let c = Color[0]
-à- dire , mais pas avec les index de chaîne commelet c = Color["string"]
. Il s'agit d'une restriction connue de l'équipe Microsoft pour le problème plus général des index de chaînes d'objets .la source
typeof '0'
devrait êtrestring
Cet exemple fonctionne avec
--noImplicitAny
dans TypeScriptSources:
https://github.com/Microsoft/TypeScript/issues/13775#issuecomment-276381229 https://www.typescriptlang.org/docs/handbook/advanced-types.html#index-types
la source
Cette note se rapporte à la réponse de Basarat , pas la question d'origine.
J'ai eu un problème étrange dans mon propre projet où le compilateur donnait une erreur à peu près équivalente à "ne peut pas convertir la chaîne en couleur" en utilisant l'équivalent de ce code:
J'ai trouvé que l'inférence du type de compilateur devenait confuse et il pensait que
colorId
c'était une valeur d'énumération et non un ID. Pour résoudre le problème, j'ai dû convertir l'ID en chaîne:Je ne sais pas ce qui a causé le problème, mais je vais laisser cette note ici au cas où quelqu'un rencontrerait le même problème que moi.
la source
Je l'ai fait fonctionner en utilisant le code suivant.
la source
Si vous fournissez des valeurs de chaîne à votre énumération, une distribution droite fonctionne très bien.
la source
const colorEnum = "Blue" as Color
ne fera pas d'erreur, et vous seriez laissé penser quecolorEnum
c'est OK. Mais si vous y étiezconsole.log
, vous verriez "Blue". La réponse d'Artru est agréable, carcolorEnum
elle le seraundefined
- et vous pourrez alors le vérifier spécifiquement.Étant donné que vous utilisez tapuscrit: la plupart des solutions ci-dessus peuvent ne pas fonctionner ou sont trop complexes.
Situation : les chaînes ne sont pas les mêmes que les valeurs d'énumération (le boîtier diffère)
Utilisez simplement:
la source
J'ai également rencontré la même erreur de compilation. Juste une légère variation plus courte de l'approche de Sly_cardinal.
la source
myProp.color = Color[<string><any>myProp.color]
CheersSi le compilateur TypeScript sait que le type de variable est une chaîne, cela fonctionne:
Sinon, vous devez le convertir explicitement en chaîne (pour éviter les avertissements du compilateur):
Au moment de l'exécution, les deux solutions fonctionnent.
la source
<string>colorName
au lieu de"" + colorName
?Il y a beaucoup d'informations mitigées dans cette question, nous allons donc couvrir toute l'implémentation de TypeScript 2.x + dans le Guide de Nick pour utiliser les énumérations dans les modèles avec TypeScript .
Ce guide est destiné aux personnes qui créent du code côté client qui ingère un ensemble de chaînes connues du serveur qui serait commodément modélisé en tant qu'énumération côté client.
Définir l'énumération
Commençons par l'énumération. Ça devrait ressembler a quelque chose comme ca:
Deux choses à noter ici:
Nous les déclarons explicitement comme des cas d'énumération basés sur des chaînes, ce qui nous permet de les instancier avec des chaînes, et non avec d'autres nombres non liés.
Nous avons ajouté une option qui peut ou peut ne pas exister sur notre modèle de serveur:
UNKNOWN
. Cela peut être géré commeundefined
si vous préférez, mais j'aime éviter| undefined
autant que possible les types pour simplifier la manipulation.La grande chose d'avoir un
UNKNOWN
cas est que vous pouvez être vraiment évident à ce sujet dans le code et créer des styles pour les cas d'énumération inconnus rouge vif et clignotant afin que vous sachiez que vous ne gérez pas quelque chose correctement.Analyser l'énumération
Vous pouvez utiliser cette énumération incorporée dans un autre modèle, ou tout seul, mais vous devrez analyser l'énumération de type y à partir de JSON ou XML (ha) dans votre homologue fortement typé. Lorsqu'il est intégré dans un autre modèle, cet analyseur vit dans le constructeur de classe.
Si l'énumération est correctement analysée, elle deviendra le type approprié. Sinon, ce sera le cas
undefined
et vous pourrez l'intercepter et retourner votreUNKNOWN
cas. Si vous préférez utiliserundefined
comme cas inconnu, vous pouvez simplement renvoyer n'importe quel résultat de l'analyse enum tentée.À partir de là, il suffit d'utiliser la fonction d'analyse et d'utiliser votre nouvelle variable typée forte.
la source
IssueType["REPS"]="REPS"
. Si vous aviez défini votre enum un peu différent, disons,REPS="reps"
cela donneraitIssueType["REPS"]="reps"
ce qui ...IssueType.UNKNOWN
car il n'y a pas de cléreps
dans votre énumération. Dommage, je n'ai toujours trouvé aucune solution de travail pour cela car mes chaînes contiennent des tirets ce qui les rend inutilisables comme clés.Je cherchais une réponse qui peut obtenir un
enum
de astring
, mais dans mon cas, les valeurs enums avaient des valeurs de chaîne différentes. L'OP avait une énumération simpleColor
, mais j'avais quelque chose de différent:Lorsque vous essayez de résoudre
Gender.CantTell
avec une"Can't tell"
chaîne, il revientundefined
avec la réponse d'origine.Une autre réponse
Fondamentalement, j'ai trouvé une autre réponse, fortement inspirée par cette réponse :
Remarques
filter
, en supposant que le client passe une chaîne valide à partir de l'énumération. Si ce n'est pas le cas,undefined
sera retourné.enumObj
enany
, car avec TypeScript 3.0+ (utilisant actuellement TypeScript 3.5), leenumObj
est résolu commeunknown
.Exemple d'utilisation
Remarque: Et, comme quelqu'un l'a souligné dans un commentaire, je voulais également utiliser le
noImplicitAny
.Version mise à jour
Pas de
any
transtypage et typages appropriés.De plus, la version mise à jour a un moyen plus simple de l'appeler et est plus lisible:
la source
J'avais besoin de savoir comment boucler sur les valeurs d'énumération (testait beaucoup de permutations de plusieurs énumérations) et j'ai trouvé que cela fonctionnait bien:
Source: https://blog.mikeski.net/development/javascript/typescript-enums-to-from-string/
la source
each
pour tester chaque cas d'énumération unique avec une seule méthodeEnum
Exemple d'utilisation
Ignorer l'analyse sensible à la casse
la source
return enumType[property];
dans un étui lorsque votre élément d'énumération ressemble àSkills = "anyvalue"
Les énumérations créées comme vous l'avez fait sont compilées dans un objet qui stocke les mappages avant
(name -> value)
et arrière(value -> name)
. Comme nous pouvons le constater sur cette capture d'écran de chrome devtools:Voici un exemple du fonctionnement du mappage double et de la conversion de l'un à l'autre:
la source
Essaye ça
Cela fonctionne bien pour la version 3.5.3
la source
Si vous utilisez des espaces de noms pour étendre les fonctionnalités de votre énumération, vous pouvez également faire quelque chose comme
et l'utiliser comme ça
la source
une autre variation peut être
la source