TypeScript
fournit à la fois des énumérations numériques et des énumérations basées sur des chaînes.enum
.enum
numérique où Up
est initialisé avec 1
.
Tous les membres suivants sont auto-incrémentés à partir de ce moment.
En d'autres termes, Direction.Up
a la valeur 1
, Down
a 2
, Left
a 3
et Right
a 4
.Up
aurait la valeur 0
, Down
aurait 1
, etc...
Ce comportement d'auto-incrémentation est utile dans les cas où nous ne nous soucions peut-être pas des valeurs de membre elles-mêmes,
mais que chaque valeur soit distincte des autres valeurs du même enum
.enum
lui-même.JavaScript
de manière intelligente, il est conseillé de ne pas le faire.enum
est associé à une valeur qui peut être constante ou calculée.
Un membre enum
est considéré comme constant si :0
:enum
précédent était une constante numérique.
Dans ce cas, la valeur du membre enum
actuel sera la valeur du membre enum
précédent plus un.enum
est initialisé avec une expression enum
constante.
Une expression constante enum
est un sous-ensemble d'expressions TypeScript
qui peuvent être entièrement évaluées lors de la compilation.
Une expression est une expression constante enum
si elle est :+, -, ~
appliqué à l' expression de la constante enum+, -, *, /, %, <<, >>, >>>, &, |, ^
Opérateurs binaires avec des expressions enum
constantes comme opérandes. Il est une erreur de compilation pour les expressions ENUM constantes à évaluer à NaNou
Infinity
.enum
est considéré comme calculé.enum
constant qui ne sont pas calculés : les membres enum
littéraux.
Un membre enum
littéral est un membre enum
constant sans valeur initialisée ou avec des valeurs initialisées àfoo
", "bar
", "baz
")1
, 100
)-
) unaire appliqué à n'importe quel littéral numérique (par exemple -1
, -100
)enum
deviennent aussi des types !
Par exemple, nous pouvons dire que certains membres ne peuvent avoir la valeur d'un membre enum
:enum
eux-mêmes deviennent effectivement une union de chaque membre enum
.
Bien que nous n'ayons pas encore discuté des types d'union , tout ce que vous devez savoir, c'est qu'avec les énumérations d'unions,
le système de types est capable de tirer parti du fait qu'il connaît le jeu exact de valeurs qui existent dans le enum
.
à cause de cela, TypeScript
peut attraper des bugs stupides où nous pourrions être en train de comparer des valeurs de manière incorrecte.x
n'était pas le cas E.Foo
.
Si cette vérification réussit, nous allons court-circuiter ||
et le corps du "si" sera exécuté.
Cependant, si la vérification échoue, x
ne peut en être E.Foo
ainsi,
il n'a donc aucun sens de savoir si elle est égale à E.Bar
.enum
en noms de enum
.TypeScript
pourrait compiler ceci en quelque chose comme le JavaScript
suivant :name-> value
) et inverses (value-> name
). Les références à d'autres membres
de l'énumération sont toujours émises en tant qu'accès à la propriété et ne sont jamais alignées.String enum
ne reçoivent pas du tout de mappage inverse.enum
sont une solution parfaitement valable.
Cependant, les exigences sont parfois plus strictes. Pour éviter de payer le coût supplémentaire
de code généré et d'indirection supplémentaire lors de l'accès à des valeurs enum
,
il est possible d'utiliser des énumérations const
. Les énumérations constantes
sont définies à l'aide du modificateur const
de nos énumérations :const enum
sont en ligne sur les sites d'utilisation.
Cela est possible car les énumérations constantes ne peuvent pas avoir de membres calculés.enum
précédent est considéré comme constant.
En revanche, un membre enum
ambiant (et non-const) qui ne possède pas d'initialiseur est toujours considéré
comme étant calculé.