<commit_before># 枚举

使用枚举我们可以定义一些有名字的数字常量。
枚举通过`enum`关键字来定义。

```ts
enum Direction {
    Up = 1,
    Down,
    Left,
    Right
}
```

一个枚举类型可以包含零个或多个枚举成员。
枚举成员具有一个数字值，它可以是*常数*或是*计算得出的值*
当满足如下条件时，枚举成员被当作是常数：

* 不具有初始化函数并且之前的枚举成员是常数。
  在这种情况下，当前枚举成员的值为上一个枚举成员的值加1。
  但第一个枚举元素是个例外。
  如果它没有初始化方法，那么它的初始值为`0`。
* 枚举成员使用*常数枚举表达式*初始化。
  常数枚举表达式是TypeScript表达式的子集，它可以在编译阶段求值。
  当一个表达式满足下面条件之一时，它就是一个常数枚举表达式：
  * 数字字面量
  * 引用之前定义的常数枚举成员（可以是在不同的枚举类型中定义的）
      如果这个成员是在同一个枚举类型中定义的，可以使用非限定名来引用。
  * 带括号的常数枚举表达式
  * `+`, `-`, `~` 一元运算符应用于常数枚举表达式
  * `+`, `-`, `*`, `/`, `%`, `<<`, `>>`, `>>>`, `&`, `|`, `^` 二元运算符，常数枚举表达式做为其一个操作对象
  若常数枚举表达式求值后为`NaN`或`Infinity`，则会在编译阶段报错。

所有其它情况的枚举成员被当作是需要计算得出的值。

```ts
enum FileAccess {
    // constant members
    None,
    Read    = 1 << 1,
    Write   = 1 << 2,
    ReadWrite  = Read | Write,
    // computed member
    G = "123".length
}
```

枚举是在运行时真正存在的一个对象。
其中一个原因是因为这样可以从枚举值到枚举名进行反向映射。

```ts
enum Enum {
    A<commit_msg>Add a new line before "It is a compile time ...". PR639<commit_after># 枚举

使用枚举我们可以定义一些有名字的数字常量。
枚举通过`enum`关键字来定义。

```ts
enum Direction {
    Up = 1,
    Down,
    Left,
    Right
}
```

一个枚举类型可以包含零个或多个枚举成员。
枚举成员具有一个数字值，它可以是*常数*或是*计算得出的值*
当满足如下条件时，枚举成员被当作是常数：

* 不具有初始化函数并且之前的枚举成员是常数。
  在这种情况下，当前枚举成员的值为上一个枚举成员的值加1。
  但第一个枚举元素是个例外。
  如果它没有初始化方法，那么它的初始值为`0`。
* 枚举成员使用*常数枚举表达式*初始化。
  常数枚举表达式是TypeScript表达式的子集，它可以在编译阶段求值。
  当一个表达式满足下面条件之一时，它就是一个常数枚举表达式：
  * 数字字面量
  * 引用之前定义的常数枚举成员（可以是在不同的枚举类型中定义的）
      如果这个成员是在同一个枚举类型中定义的，可以使用非限定名来引用。
  * 带括号的常数枚举表达式
  * `+`, `-`, `~` 一元运算符应用于常数枚举表达式
  * `+`, `-`, `*`, `/`, `%`, `<<`, `>>`, `>>>`, `&`, `|`, `^` 二元运算符，常数枚举表达式做为其一个操作对象。
  若常数枚举表达式求值后为`NaN`或`Infinity`，则会在编译阶段报错。

所有其它情况的枚举成员被当作是需要计算得出的值。

```ts
enum FileAccess {
    // constant members
    None,
    Read    = 1 << 1,
    Write   = 1 << 2,
    ReadWrite  = Read | Write,
    // computed member
    G = "123".length
}
```

枚举是在运行时真正存在的一个对象。
其中一个原因是因为这样可以从枚举值到枚举名进行反向映射。

```ts
enum Enum {
    A
{'fraction_non_alphanumeric': 0.1616213442791175, 'fraction_numerical': 0.011800923550538737, 'mean_word_length': 3.9242424242424243, 'pattern_counts': {'":': 0, '<': 15, '<?xml version=': 0, '>': 13, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '730012', 'n_tokens_mistral': 1407, 'n_tokens_neox': 1587, 'n_words': 119}