//枚举
//支持数字枚举和基于字符串的枚举
enum Direction{
    Up =1,
    Down,
    Left,
    Right,
}
//此处将Up初始化为1,则其他成员会从1开始自动增长。
//没有初始化时,从开始自动增长

//使用枚举属性访问枚举成员
enum response{
    No=0,
    Yes =1,
}
function respond(recipient:string,message:response):void {
    //..
}
respond('Princess Caroline',response.Yes);

//不带初始化器的枚举 或者被放在第一的位置,或者被放在使用了数字敞亮或其他常量初始化了的枚举后面。
//如以下情况不被允许,报错
// enum E{
//     A =getSomeValue(),
//     B,
// }

//字符串枚举
//每个成员都必须用字符串字面量,或另外一个字符串成员进行初始化

enum Directionc{
    Up = 'UP',
    Down = 'DOWN',
    Left = 'LEFT',
    Right = 'RIGHT',
}
//数字枚举时,其值很难访问,字符串枚举时提供一个可读值,独立于枚举成员的名字。

//异构枚举
//它不带有初始化器且它之前的枚举成员是一个 数字常量。 这种情况下,当前枚举成员的值为它上一个枚举成员的值加1。
enum E2 {
    A = 1, B, C
}

//字面量枚举成员的类型
//字面量枚举成员是指不带有初始值的常量枚举成员,或者是值被初始化为
//1、任何字符串字面量
//2、任何数字字面量
//3、应用了一元 - 符号的数字字面量
//当所有枚举成员都拥有字面量枚举值时,它就带有了一种特殊的语义。

// 首先,枚举成员成为了类型! 例如,我们可以说某些成员 只能是枚举成员的值:
// enum ShapeKind{
//     Circle,
//     Square,
// }
// interface Circle{
//     kind:ShapeKind.Circle,
//     radius:number,
// }
// interface Square{
//     kind:ShapeKind.Square;
//     sideLength:number;
// }
// let c:Circle = {
//     kind :ShapeKind.Square,
//     //报错,此值只属于CIRCLE
//     radius:100,
// }
//
// //枚举类型编程每个枚举成员的联合
// enum E{
//     Foo,
//     Bar,
// }
// function f(x:E) {
//     if(x!==E.Foo||x!==E.Bar){
//         //报错。此处类型系统可以指导枚举里的值的集合
//         //我们先检查 x是否不是 E.Foo。 如果通过了这个检查,然后 ||会发生短路效果, if语句体里的内容会被执行。 然而,这个检查没有通过,那么 x则 只能为 E.Foo,因此没理由再去检查它是否为 E.Bar。
//     }
// }

// function f(obj:{X:number}) {
//     return obj.X;
// }
// f(E2)//此处当E中有X 属性时可以运行。

//反向映射
//可以从枚举值到枚举名
enum Enum{
    A
}
let a = Enum.A;
let nameOfA = Enum[a];//'A'
//不会为字符串枚举成员生成反向映射

//const 枚举
//常量枚举只能使用常量枚举表达式,并且不同于常规的枚举,他们在编译阶段会被删除。
//常量枚举成员在使用的地方会被内联进来。之所以可以这么做是因为,常量枚举不允许包含计算成员。
// const enum Directions{
//     Up,
//     Down,
//     Left,
//     Right
// }
// let directions = {
//     Directions.Up,
//     Directions.Down,
// }

//外部枚举
declare enum Enum2{
    B,
    C,
}
//外部枚举和非外部枚举之间有一个重要的区别,在正常的枚举里,没有初始化方法的成员被当成常数成员。 对于非常数的外部枚举而言,没有初始化方法时被当做需要经过计算的。

//枚举
//支持数字枚举和基于字符串的枚举
enum Direction{
    Up =1,
    Down,
    Left,
    Right,
}
//此处将Up初始化为1,则其他成员会从1开始自动增长。
//没有初始化时,从开始自动增长

//使用枚举属性访问枚举成员
enum response{
    No=0,
    Yes =1,
}
function respond(recipient:string,message:response):void {
    //..
}
respond('Princess Caroline',response.Yes);

//不带初始化器的枚举 或者被放在第一的位置,或者被放在使用了数字敞亮或其他常量初始化了的枚举后面。
//如以下情况不被允许,报错
// enum E{
//     A =getSomeValue(),
//     B,
// }

//字符串枚举
//每个成员都必须用字符串字面量,或另外一个字符串成员进行初始化

enum Directionc{
    Up = 'UP',
    Down = 'DOWN',
    Left = 'LEFT',
    Right = 'RIGHT',
}
//数字枚举时,其值很难访问,字符串枚举时提供一个可读值,独立于枚举成员的名字。

//异构枚举
//它不带有初始化器且它之前的枚举成员是一个 数字常量。 这种情况下,当前枚举成员的值为它上一个枚举成员的值加1。
enum E2 {
    A = 1, B, C
}

//字面量枚举成员的类型
//字面量枚举成员是指不带有初始值的常量枚举成员,或者是值被初始化为
//1、任何字符串字面量
//2、任何数字字面量
//3、应用了一元 - 符号的数字字面量
//当所有枚举成员都拥有字面量枚举值时,它就带有了一种特殊的语义。

// 首先,枚举成员成为了类型! 例如,我们可以说某些成员 只能是枚举成员的值:
// enum ShapeKind{
//     Circle,
//     Square,
// }
// interface Circle{
//     kind:ShapeKind.Circle,
//     radius:number,
// }
// interface Square{
//     kind:ShapeKind.Square;
//     sideLength:number;
// }
// let c:Circle = {
//     kind :ShapeKind.Square,
//     //报错,此值只属于CIRCLE
//     radius:100,
// }
//
// //枚举类型编程每个枚举成员的联合
// enum E{
//     Foo,
//     Bar,
// }
// function f(x:E) {
//     if(x!==E.Foo||x!==E.Bar){
//         //报错。此处类型系统可以指导枚举里的值的集合
//         //我们先检查 x是否不是 E.Foo。 如果通过了这个检查,然后 ||会发生短路效果, if语句体里的内容会被执行。 然而,这个检查没有通过,那么 x则 只能为 E.Foo,因此没理由再去检查它是否为 E.Bar。
//     }
// }

// function f(obj:{X:number}) {
//     return obj.X;
// }
// f(E2)//此处当E中有X 属性时可以运行。

//反向映射
//可以从枚举值到枚举名
enum Enum{
    A
}
let a = Enum.A;
let nameOfA = Enum[a];//'A'
//不会为字符串枚举成员生成反向映射

//const 枚举
//常量枚举只能使用常量枚举表达式,并且不同于常规的枚举,他们在编译阶段会被删除。
//常量枚举成员在使用的地方会被内联进来。之所以可以这么做是因为,常量枚举不允许包含计算成员。
// const enum Directions{
//     Up,
//     Down,
//     Left,
//     Right
// }
// let directions = {
//     Directions.Up,
//     Directions.Down,
// }

//外部枚举
declare enum Enum2{
    B,
    C,
}
//外部枚举和非外部枚举之间有一个重要的区别,在正常的枚举里,没有初始化方法的成员被当成常数成员。 对于非常数的外部枚举而言,没有初始化方法时被当做需要经过计算的。