Jansiel Notes

TypeScript 中的枚举(enum)

枚举是 TypeScript 为数不多的特性之一,它不是 JavaScript 的类型级扩展。
枚举允许开发人员定义一组命名常量。使用枚举可以更轻松地记录意图,或创建一组不同的案例。TypeScript 提供基于数字和字符串的枚举。

数字类型枚举

  • 如果没有定义枚举的值,那么枚举就会从 0 开始递增,每次加1,例如:
1enum test {
2    A, // A = 0
3    B, // B = 1
4    C // C = 2 
5}
  • 如果定义枚举值为Number类型的数字,那么就会从定义的数字开始递增,例如:
1enum Test {
2    A = 5, // A = 5
3    B, // B = 6
4    C // C = 7
5}

使用数字类型作为标志

枚举的一个很好用途是使用枚举作为标志。这些标志允许你检查一组条件中的某个条件是否为真。考虑如下代码例子, 我们有一组关于 Test 的属性:

1enum Test {
2    None        = 0,
3    HasClaws    = 1 << 0,
4    CanFly      = 1 << 1,
5    EatsFish    = 1 << 2,
6    Endangered  = 1 << 3
7}

在这里,我们使用了左移的位运算符,将数字 1 的二进制向左移动位置得到数字0001001001001000(换成十进制结果是:1, 2, 4, 8)。当你在使用这种标记的时候,这些位运算符 | (或)& (和)~ (非)将会是你最好的朋友:

 1enum TestFlags {
 2  None        = 0,
 3  HasClaws    = 1 << 0,
 4  CanFly      = 1 << 1
 5}
 6
 7interface Test {
 8  flags: TestFlags;
 9  [key: string]: any;
10}
11
12function printTestAbilities(test: Test) {
13    var testFlags = test;
14    if (testFlags & TestFlags.HasClaws) {
15        console.log(\'动物有爪子\');
16    }
17    if (testFlags & TestFlags.CanFly) {
18        console.log(\'动物会飞\');
19    }
20    if (testFlags == TestFlags.None) {
21        console.log(\'没有什么\');
22    }
23}
24// 使用
25var test = { flags: AnimalFlags.None };
26printTestAbilities(test); // 没有什么
27animal.flags |= TestFlags.HasClaws;
28printTestAbilities(test); // 动物有爪子
29animal.flags &= ~TestFlags.HasClaws;
30printTestAbilities(test); // 没有什么
31animal.flags |= TestFlags.HasClaws | TestFlags.CanFly;
32printAnimalAbilities(animal); // 动物有爪子, 动物会飞

在这里:

  • 我们使用 |= 来添加一个标志;
  • 组合使用 &=~ 来清理一个标志;
  • | 来合并标志;

可以组合标志,用来在枚举类型中定义方便快捷的方式,如下:

1enum Test {
2    None        = 0,
3    HasClaws    = 1 << 0,
4    CanFly      = 1 << 1,
5    EatsFish    = 1 << 2,
6    Endangered  = 1 << 3,
7    Combination = 
8}
上一篇: 暂无