【TypeScript】初步了解枚举

TypeScript 初步了解枚举

理解:枚举是列举固定几个值,直接定义变量的话的话可以随意定义,枚举只能使用你定义好的几个值。使用枚举我们可以定义一些带名字的常量,TypeScript支持数字的和基于字符串的枚举

使用了枚举,别人只能传你枚举类里定义好的几个类型,传其它的就会在编译时期报错

数字枚举

我们定义了一个数字枚举, Up使用初始化为 1。 其余的成员会从 1开始自动增长(自增长1)。 换句话说,Direction.Up的值为 1, Down为 2, Left为 3, Right为 4

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

不使用初始化器,则 Up的值为 0, Down的值为 1…自增长的行为是很有用处的,但是要注意每个枚举成员的值都是不同的

enum Direction { Up, Down, Left, Right }

通过枚举的属性来访问枚举成员,和枚举的名字来访问枚举类型:

enum response {
  No = 0,
  Yes = 1
}

function a(b: string, message: response): void {
  // ...
}

a("test", response.Yes)

下面的情况不被允许的:

enum E {
  A = getSomeValue(),
  B // error! 'A' is not constant-initialized, so 'B' needs an initializer
}

原因: 由于getSomeValue()不是一个初始常量(到运行时才能确定的值就不是constant值了),所以此时需要给B初始值

字符串枚举:

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

enum a {
  Up = "Up",
  Down = "DOWN",
  Left = "LEFT",
  Right = "RIGHT"
}
计算的和常量成员

// 以下所有枚举成员都是常量
enum E { X }
enum E1 { X, Y, Z }
enum E2 {
    A = 1, B, C
}
 
enum FileAccess {
    None,
    Read    = 1 << 1,
    Write   = 1 << 2,
    ReadWrite  = Read | Write,
    // computed member
    G = "123".length
}
联合枚举与枚举成员的类型

当枚举成员成为了类型


enum ShapeKind {
    Circle,
    Square,
}
 
interface Circle {
    kind: ShapeKind.Circle;
    radius: number;
}
 
interface Square {
    kind: ShapeKind.Square;
    sideLength: number;
}
 
let c: Circle = {
    kind: ShapeKind.Square,
    //    ~~~~~~~~~~~~~~~~ Error!
    radius: 100
}

当枚举类型本身变成了每个枚举成员的 联合 👇

下面这个例子里,我们先检查 x是否不是 E.Foo。 如果通过了这个检查,然后 ||会发生短路效果, if语句体里的内容会被执行。 然而,这个检查没有通过,那么 x则 只能为 E.Foo,因此没理由再去检查它是否为 E.Bar

enum E {
    Foo,
    Bar,
}
 
function f(x: E) {
    if (x !== E.Foo || x !== E.Bar) {
        //             ~~~~~~~~~~~
        // Error! Operator '!==' cannot be applied to types 'E.Foo' and 'E.Bar'.
    }
}
反向映射
enum Enum {
  A
}
let a = Enum.A;
let nameOfA = Enum[a]; // "A"
// 例如打印下Role 看看解构

enum Role {
    Reporter = 1,
    Developer,
    Maintainer,
    Owner,
    Guest
}

在这里插入图片描述

外部枚举

外部枚举用来描述已经存在的枚举类型的形状

declare enum Enum {
  A = 1,
  B,
  C = 2
}

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

总结
1.成员不初始化的话,默认是从0开始自增
enum Enum {A,B,C }
console.log(Enum); // {0: "A",1: "B",2: "C",A: 0,B: 1,C: 2}
 
2.数字型的枚举可以映射,字符串类型的枚举是不可以映射的.
enum Enum {A,B}
enum Strs {A = 'apple',B = 'orange'}
console.log(Enum); // {0: "A",1: "B",A: 0,B: 1}
console.log(Strs ); // {A: "apple"B: "orange"}
 
3.第一个成员初始化赋值为3的话,后面的成员从3开始增长
enum Enum {A = 3,B,C}
console.log(Enum); // {3: 'A',4: 'B',5:'C', A: 3,B: 4,C: 5}
 
4.如果第n个成员初始化赋值为string类型,则n后面的成员要给初始值
enum Enum {A,B='apple',C}; // 此时C不初始化会报错  Enum member must have initializer
 
5.不建议数字枚举和字符串枚举混用
enum Enum {A,B='apple',C}; 这种是不建议的
 
6.常量枚举成员在编译阶段会被计算出结果,计算类枚举成员的值会被保留,只有到运行时才会被计算
 
7.const声明的枚举是常量枚举,会在编译阶段被移出,意味着编译后没有任何代码的
当不需要对象,但需要一个对象的值的时候使用常量枚举
const enum Month { Jan, Feb, Mar, Apr }
let month = [Month.Jan, Month.Feb, Month.Mar]; 
// 编译的结果Month 是没有产生任何代码的
var month = [0 /* Jan */, 1 /* Feb */, 2 /* Mar */];
 
8.枚举类型:.所有成员没有初始值       enum E { a, b }.所有成员初始值为数字     enum F { a = 0, b = 1 }.所有成员初始值为字符串   enum G { a = 'apple', b = 'banana' }
TypeScript中,枚举(Enums)是一种用于定义命名常量集合的数据类型。枚举允许我们为一组相关的值分配易于理解的名称。 以下使用枚举的示例: ```typescript enum Direction { Up, Down, Left, Right } let myDirection: Direction = Direction.Up; console.log(myDirection); // 输出:0 // 使用枚举值 if (myDirection === Direction.Up) { console.log("向上移动"); } ``` 在上面的例子中,我们定义了一个名为Direction枚举。它包含了Up、Down、Left和Right四个枚举成员,它们分别对应的值是0、1、2和3。 我们可以通过将枚举成员赋值给变量使用枚举值。在示例中,我们将Direction.Up赋给了myDirection变量,并输出了它的值(0)。 我们还可以使用if语句对枚举进行比较,以执行相应的操作。 除了默认情况下从0开始的自增值,我们还可以手动给枚举成员指定值: ```typescript enum Direction { Up = 1, Down, Left, Right } console.log(Direction.Down); // 输出:2 ``` 在这个例子中,我们手动给Up赋值为1,后续成员的值会根据前一个成员自动递增。 枚举还支持反向映射,即可以通过枚举值获取对应的枚举成员的名称: ```typescript enum Direction { Up = 1, Down, Left, Right } console.log(Direction[2]); // 输出:Down ``` 在这个例子中,我们通过使用方括号索引的方式,将2作为索引值传递给Direction枚举,然后输出对应的枚举成员名称(Down)。 枚举还支持其他一些高级特性,如字符串枚举、异构枚举等,你可以根据具体需求来选择适合的枚举类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值