枚举

224 阅读4分钟
  1. 数字枚举

    // 数字枚举的值 如果都没有设置 会从0 开始自增长  0   1  2 3 ...
    enum Direction {
        Up,
        Down,
        Left,
        Right
    }
    
    // 如果中间设置了值 那么后面的值 会从设置的值部分开始自增长
    // UP = 0   Down = 5      Left = 6   Right = 7
    enum Direction {
        Up,
        Down = 5,
        Left,
        Right
    }
    
    // 使用枚举很简单: 通过枚举的属性来访问枚举成员,和枚举的名字来访问枚举类型
    enum Response {
        No = 0,
        Yes = 1,
    }
    
    function respond(recipient: string, message: Response): void {
        // ...
    }
    
    respond("Princess Caroline", Response.Yes)
    
  2. 字符串枚举

    //  在一个字符串枚举里,每个成员都必须用字符串字面量,或另外一个字符串枚举成员进行初始化。
    
    // 字符串的枚举值 没有自增长的行为
    enum Direction {
        Up = "UP",
        Down = "DOWN",
        Left = "LEFT",
        Right = "RIGHT",
    }
    
  3. 异构枚举

    // 枚举值的类型可以不一样的 不建议这么做
    
    enum Minxin {
        No = 1,
        Yes = "YES",
    }
    
  4. 计算的和常量成员

    //每个枚举成员都带有一个值,它可以是 常量或 计算出来的。 当满足如下条件时,枚举成员被当作是常量:
    // 1. 它是枚举的第一个成员且没有初始化器,这种情况下它被赋予值 0:
    enum E { X }
    // 2 它不带有初始化器且它之前的枚举成员是一个 数字常量。 这种情况下,当前枚举成员的值为它上一个枚举成员的值加1。
    enum E1 { X, Y, Z }
    
    enum E2 {
        A = 1, B, C
    }
    
    //3. 枚举成员使用 常量枚举表达式初始化。 常数枚举表达式是TypeScript表达式的子集,它可以在编译阶段求值。 当一个表达式满足下面条件之一时,它就是一个常量枚举表达式:
    //一个枚举表达式字面量(主要是字符串字面量或数字字面量)
    //一个对之前定义的常量枚举成员的引用(可以是在不同的枚举类型中定义的)
    //带括号的常量枚举表达式
    //一元运算符 +, -, ~其中之一应用在了常量枚举表达式
    //常量枚举表达式做为二元运算符 +, -, *, /, %, <<, >>, >>>, &, |, ^的操作对象。 若常数枚举表达式求值后为 NaN或 Infinity,则会在编译阶段报错。
    enum FileAccess {
        // constant members
        None,
        Read    = 1 << 1,
        Write   = 1 << 2,
        ReadWrite  = Read | Write,
        // computed member
        G = "123".length
    }
    
  5. 联合枚举与枚举成员的类型

    // 存在一种特殊的非计算的常量枚举成员的子集:字面量枚举成员。 字面量枚举成员是指不带有初始值的常量枚举成员,或者是值被初始化为
     // 1. 任何字符串字面量(例如: "foo", "bar", "baz")
     // 2. 任何数字字面量(例如: 1, 100)
     // 3. 应用了一元 -符号的数字字面量(例如: -1, -100)
    
  6. 运行时枚举

    // 枚举是在运行时真正存在的对象。 例如下面的枚举:
    enum E {
        X, Y, Z
    }
    
    function f(obj: { X: number }) {
        return obj.X;
    }
    
    // Works, since 'E' has a property named 'X' which is a number.
    f(E);
    
  7. 反向映射

    // 创建一个以属性名作为对象成员的对象之外,数字枚举成员哪还具有了反向映射,从枚举值到枚举名字
    enum Enum {
        A
    }
    let a = Enum.A;
    let nameOfA = Enum[a]; // "A"
    
  8. const 枚举

    //大多数情况下,枚举是十分有效的方案。 然而在某些情况下需求很严格。 为了避免在额外生成的代码上的开销和额外的非直接的对枚举成员的访问,我们可以使用 const枚举。 常量枚举通过在枚举上使用 const修饰符来定义。
    
    const enum Enum {
        A = 1,
        B = A * 2
    }
    
    //常量枚举只能使用常量枚举表达式,并且不同于常规的枚举,它们在编译阶段会被删除。 常量枚举成员在使用的地方会被内联进来。 之所以可以这么做是因为,常量枚举不允许包含计算成员。
    const enum Directions {
        Up,
        Down,
        Left,
        Right
    }
    
    let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]
    
  9. 外部枚举

    // 外部枚举用来描述已经存在的枚举类型的形状。
    declare enum Enum {
        A = 1,
        B,
        C = 2
    }
    
    //外部枚举和非外部枚举之间有一个重要的区别,在正常的枚举里,没有初始化方法的成员被当成常数成员。 对于非常数的外部枚举而言,没有初始化方法时被当做需要经过计算的。