# 枚举
# 枚举类型(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
# 枚举成员类型
当枚举的成员满足了一定条件以后,枚举成员可以作为数据类型使用。
- 所有的枚举成员都是未赋值的
- 所有的枚举成员都是数值
- 所有的枚举成员都是字符串
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
}