# 枚举

# 枚举类型(enum)

在计算机科学中,我们经常使用数值来表示一种状态。但是对于较多的状态使用数值来表示可能导致易读性差。比如十二生肖如果我们用0,1,2,3,4...11来表示,那么可能根本不知道究竟每一个代表什么。但是如果我们用有含义的单词来表示,那么程序就比较容易理解与阅读。比如看到猪我就知道这个生肖是猪。枚举就是考虑到所有的可能出现的值,然后用具有函数的单词来表示它。

枚举又可以成为一一列举,在计算机计算中,将一个有穷序列集所有可能的值列举出来就称为枚举。比如:星期可以使用Sunday、Monday、Tuesday、Wednesday、Thursday、Friday、Saturday来进行枚举。生肖可以使用龙、蛇、狗等十二种来进行枚举。总而言之:枚举就是列举一些见名知意的值 TypeScript只支持数字的和基于字符串的枚举。

enum 枚举名{
  标识符=[整型常数 | 字符串],
  标识符=[整型常数 | 字符串],
  标识符=[整型常数 | 字符串],
}

# 数字枚举

枚举类型的使用:枚举类型如果没有指定值,那么默认是从0开始。

enum data {
  success,
  error
}
console.log(data.success)  // 0
console.log(data.error)    // 1

如果指定了值,那么从指定的值往下递增。

enum data {
  pedding,
  success = 100,
  error
}
console.log(data.pedding)  // 0
console.log(data.success)  // 100
console.log(data.error)    //101

枚举的数值还可以使用变量或者计算数值,但是随后的枚举值必须手动设置初始值

let count = 100;
function getNum():number{
    return 200;
}
enum data {
    success = count,        // 通过变量获取枚举数值
    pending = getNum(),     // 通过计算获取枚举数值
    error = 2,              // 这里必须设置初始值
};
console.log(data.success);  // 100
console.log(data.pending);  // 200
console.log(data.error);    // 2

# 字符串枚举

字符串枚举里,每个成员都必须用字符串字面量,或另外一个字符串枚举成员进行初始化。 字符串枚举不能使用变量,计算返回的值或者其他枚举成员的值。

enum progress {
    success = 'Success',
    pending = 'Pending',
    error = 'Error'
}
console.log(progress.success);  // Success
console.log(progress.pending);  // Pending
console.log(progress.error);    // Error

# 异构枚举

异构枚举就是既包含字符串枚举又包含数值枚举。通常不建议这样操作。

enum data {
    success = 0,
    error = 'error'
}

# 反向映射

枚举除了创建一个以属性名做为对象成员的对象之外,数字枚举成员还具有了反向映射,从枚举值到枚举名字。 我们可以打印一下创建的枚举的值。

enum data {
    success = 1,        // 通过变量获取枚举数值
    pending =3,     // 通过计算获取枚举数值
    error = 5,              // 这里必须设置初始值
};
console.log(data);

我们观察一下打印出来的值。

枚举

我们可以看到枚举对象下面,不仅有属性1,3,5而且有属性'success','pending','error'。 也就是说我们既可以通过data.success获取值,也可以通过data[0]获取值。示例:

enum data {
    success = 1,        // 通过变量获取枚举数值
    pending =3,     // 通过计算获取枚举数值
    error = 5,              // 这里必须设置初始值
};
console.log(data);
console.log(data.success);  // 1
let a = data.success;   // 这里必须通过枚举方式来获取值1
console.log(data[a]);   // success

# 枚举成员类型

当枚举的成员满足了一定条件以后,枚举成员可以作为数据类型使用。

  1. 所有的枚举成员都是未赋值的
  2. 所有的枚举成员都是数值
  3. 所有的枚举成员都是字符串
enum A {a};
enum B {b = 1,c = 2};
enum C {d = 'hello',e = 'world}

当枚举的成员,满足上面三种任一类型时,就可以作为一种类型使用,示例:

enum Animal {
    Dog = 1,
    Cat = 2
};
interface AInterface {
    type1:Animal.Dog,   // 接口属性定义成枚举成员类型
    type2:Animal.Cat,   // 接口属性定义成枚举成员类型
};
let animal:AInterface = {
    type1:Animal.Dog,  // 这里可以使用Animal.Dog
    type2:2            // 也可以直接使用对应的数值
}

# 联合枚举类型

我们知道当枚举成员满足一定条件后可以作为类型使用,同理整个枚举对象也可以作为一种类型使用, 只不过这时候由于枚举有多个值,因此,他是一种联合枚举类型。示例:

enum Animal {
    Dog = 1,
    Cat = 2
};
interface AInterface {
    type:Animal  // 枚举对象作为类型
};
let animal:AInterface = {
    type:Animal.Dog,  // 这里只能是Animal.Dog或者Animal.Cat
}