TypeScript真香系列的内容将参考中文文档,可是文中的例子基本不会和文档中的例子重复,对于一些地方也会深刻研究。另外,文中一些例子的结果都是在代码没有错误后编译为JavaScript获得的。若是想实际看看TypeScript编译为JavaScript的代码,能够访问TypeScript的在线编译地址,动手操做,印象更加深入。javascript
枚举是对JavaScript标准数据类型集的扩充,常被用来限定在必定范围内取值的场景。在TypeScript中支持数字和字符串的枚举。咱们能够用enum来实现。java
先看看一个数字枚举例子:git
enum Basketballer{
Yao,
Yi,
Wang
}
Basketballer.Yao; //0
Basketballer.Yi; //1
Basketballer.Wang; //2
复制代码
咱们也能够这样,下面这个方法被称为反向映射,即经过值来访问键:github
Basketballer[0]; //"Yao"
Basketballer[1]; //"Yi"
Basketballer[2]; //"Wang"
Basketballer[3]; //undefined
复制代码
上面的例子,咱们没有对Yao或者其它成员进行初始化,若是咱们进行初始化:typescript
enum Basketballer{
Yao = 1,
Yi,
Wang
}
Basketballer.Yao; //1
Basketballer.Yi; //2
Basketballer.Wang; //3
Basketballer[1]; //"Yao"
Basketballer[2]; //"Yi"
Basketballer[3]; //"Wang"
复制代码
从上面能够看出,若是一个成员设了一个值,那么后面相应的值都会递增。可是要注意的是,若是没有什么特殊的目的的话,仍是不要对多个成员进行手动赋值。由于有时候可能会致使一些问题:ui
enum Basketballer{
Yao = 1,
Yi,
Wang = 2,
Zhu,
Zhou,
}
Basketballer[2]; //"Wang"
Basketballer.Yi; //2
复制代码
一个枚举的简单应用:spa
enum Basketballer{
Yao = 1,
Yi,
Wang,
Zhu,
Zhou,
}
function one(arg: Basketballer): string{
let num = arg;
switch (num) {
case 1:
return Basketballer[num] + "第一人";
case 2:
return Basketballer[num] + "第二人";
case 3:
return Basketballer[num] + "第二人";
default:
return "篮球";
}
}
one(1); //"Yao第一人"
one(6); // "篮球人"
one("1"); //错误,“1”类型的参数不能分配给Basketballer
复制代码
在数字枚举中,咱们在定义枚举成员值的时候,能够是常量,也能够是计算出来的:code
一、枚举的第一个成员且没有初始化:对象
enum Basketballer{
Yao
}
Basketballer.Yao; //0
复制代码
二、不带初始化器而且它以前的成员是一个数字常量:ip
enum Basketballer1{
Yao, //0
Yi, //1
Wang //2
}
enum Basketballer2{
Yao = 1, //1
Yi, //2
Wang //3
}
复制代码
三、枚举成员使用常量枚举表达式初始化。当下面条件知足其中之一,就是一个常量枚举表达式: 一个枚举表达式字面量(主要是字符串字面量或数字字面量)
enum Man{ a = 1}
复制代码
一个对以前定义的常量枚举成员的引用(能够是在不一样的枚举类型中定义的)
enum Man{ a = 1, b = 2*a}
复制代码
带括号的常量枚举表达式
enum Man{ a = 1, b = 2*(a +1)}
复制代码
一元运算符 +, -, ~其中之一应用在了常量枚举表达式
enum Man{ a = 1, b= ~a}
复制代码
常量枚举表达式作为二元运算符 +, -, *, /, %, <<, >>, >>>, &, |, ^的操做对象。 若常数枚举表达式求值后为 NaN或 Infinity,则会在编译阶段报错。
enum Man{ a = 1 << 2}
复制代码
除开上面所举的全部枚举成员都被看成是须要计算出来的值:
enum Man{ a = "abc".length }
复制代码
字符串枚举中没有自增的特性,咱们在初始化的时候必须给每个成员都设字符串。
enum Basketballer{
Yao = "篮协主席",
Yi = "牌面",
Wang = "老大哥",
}
Basketballer.Yao; //"篮协主席"
复制代码
可是字符串枚举没有反向映射:
Basketballer["篮协主席"]; // 错误
复制代码
异构枚举至关于数字枚举和字符串枚举的结合体,可是官方文档不建议这样写。
enum Basketballer{
Yao = "篮协主席",
Yi = 1,
}
复制代码
咱们能够经过const修饰符来强调当前枚举类型,const枚举只能使用使用常量枚举表达式,并且会在编译阶段被删除。咱们能够用const enum来定义:
const enum Man {
A,
B,
C,
D
}
let man = [Man.A, Man.B, Man.C, Man.D];
console.log(man); // [0, 1, 2, 3]
复制代码
让咱们看看编译结果:
let man = [0 /* A */, 1 /* B */, 2 /* C */, 3 /* D */];
console.log(man); // [0, 1, 2, 3]
复制代码
外部枚举用来描述已经存在的枚举类型的形状,能够用declare enum来定义:
declare enum Man {
A,
B,
C,
D
}
let man = [Man.A, Man.B, Man.C, Man.D];
复制代码
让咱们看看编译结果:
let man = [Man.A, Man.B, Man.C, Man.D];
复制代码
github.com/zhongsp/Typ… github.com/jkchao/type…
文中有些地方可能会加入一些本身的理解,如有不许确或错误的地方,欢迎指出~