TypeScript -- 第七节 枚举

/*
*   枚举  enumeration(enum),枚举(Enum)类型用于取值被限定在一定范围内的场景。
*   使用枚举我们可以定义一些带名字的常量。 使用枚举可以清晰地表达意图或创建一组有区别的用例。
*   TypeScript支持数字的和基于字符串的枚举。
*
* */

//数字枚举
enum NumDirection {
    Up = 1,//不初始化,默认从0开始
    Down,
    Left,
    Right
}
//使用枚举很简单:通过枚举的属性来访问枚举成员,和枚举的名字来访问枚举类型
console.log(NumDirection);//通过枚举的名字来访问枚举类型
console.log(NumDirection.Up);//通过枚举的属性来访问枚举成员


// 字符串枚举
//在字符串枚举里,每个成员都必须用字符串字面量,或另外一个字符串枚举成员进行初始化。
enum EnumString{
    Up = "UP",
    Down = "DOWN",
    Left = "LEFT",
    Right = "RIGHT",
}
console.log(EnumString);//通过枚举的名字来访问枚举类型
console.log(EnumString.Up)//通过枚举的属性来访问枚举成员


//异构枚举(Heterogeneous enums)
//不建议创建混合数据类型的枚举 示例如下:
enum BooleanLikeHeterogeneousEnum {
    No = 0,
    Yes = "YES",
}

//枚举项有两种类型:常数项(constant member)和计算所得项(computed member)
//枚举--常量
//1.它是枚举的第一个成员且没有初始化器,这种情况下它被赋予值 0:
// E.X is constant:
enum E { X }
//2.它不带有初始化器且它之前的枚举成员是一个 数字常量。
// 这种情况下,当前枚举成员的值为它上一个枚举成员的值加1。
// All enum members in 'E1' and 'E2' are constant.

enum E1 { X, Y, Z }

enum E2 {
    A = 1, B, C
}
/*
* 3.枚举成员使用 常量枚举表达式初始化。
*   常数枚举表达式是TypeScript表达式的子集,它可以在编译阶段求值。 当一个表达式满足下面条件之一时,它就是一个常量枚举表达式:

       0. 一个枚举表达式字面量(主要是字符串字面量或数字字面量)
       1. 一个对之前定义的常量枚举成员的引用(可以是在不同的枚举类型中定义的)
        2.带括号的常量枚举表达式
        3.一元运算符 +, -, ~其中之一应用在了常量枚举表达式
        4.常量枚举表达式做为二元运算符 +, -, *, /, %, <<, >>, >>>, &, |, ^的操作对象。
                若常数枚举表达式求值后为 NaN或 Infinity,则会在编译阶段报错。
*
* */
enum FileAccess {
    // constant members
    None,
    Read    = 1 << 1,//左移运算符
    Write   = 1 << 2,
    ReadWrite  = Read | Write,//位运算符
    // computed member
    G = "123".length,//计算所得项
}

console.log(FileAccess.G)


//联合枚举类型与枚举成员的类型
enum ShapeKind {
    Circle,
    Square,
}

interface Circle {
    kind: ShapeKind.Circle;
    radius: number;
}

interface Square {
    kind: ShapeKind.Square;
    sideLength: number;
}

let c: Circle = {
    kind: ShapeKind.Circle,
    // kind: ShapeKind.Square,//报错
    //    ~~~~~~~~~~~~~~~~ Error!
    radius: 100,
};
console.log(c.kind);


//运行时的枚举
enum E3 {
    X, Y, Z
}
function f(obj: { X: number }) {
    return obj.X;
}
// Works, since 'E' has a property named 'X' which is a number.
console.log(f(E3));


//反向映射
enum Enum {
    A
}
let a = Enum.A;
let nameOfA = Enum[a]; // "A"
console.log(Enum.A);//0
console.log(nameOfA);//"A"


/*
* const 常量枚举
* 常量枚举通过在枚举上使用 const修饰符来定义
* 常量枚举与普通枚举的区别是,它会在编译阶段被删除,并且不能包含计算成员。
* */
const enum EnumConst {
    A = 1,
    // B= 'abc'.length //常量枚举不允许包含计算成员。
}


//外部枚举
// 此处必须使用const, 不然declare 定义的类型只会用于编译时的检查,编译结果中会被删除
declare const enum Directions {
    Up,
    Down,
    Left,
    Right
}
let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];
console.log(directions)



> 吴哲:平常心,平常心!--《士兵突击》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值