Skip to content

枚举类型

简介

使用枚举可以清晰地表达意图或创建一组有区别的用例。

typescript
enum Direction {
  Up,
  Down,
  Left,
  Right,
}


let dir1: Direction = Direction.Up // 0
let dir2: Direction = Direction['Down'] // 1

Enum 结构的特别之处在于,它既是一种类型,也是一个值。 Enum 结构在编译后会变成 JavaScript 对象,因此上述可以使用对象的方式访问枚举值(.[])。

TypeScript支持数字的和基于字符串的枚举。

数字枚举

如果没有指定枚举值,默认为数字枚举,它是一个从0开始递增的数字序列。

typescript
enum Direction {
  Up,
  Down,
  Left,
  Right,
}
// 等价于 =>
enum Direction {
  Up = 0,
  Down = 1,
  Left = 2,
  Right = 3,
}

可以通过赋值来改变默认的数字序列。

typescript
enum Direction {
  Up = 1,
  Down,
  Left,
  Right,
}
// 等价于 =>
enum Direction {
  Up = 1,
  Down = 2,
  Left = 3,
  Right = 4,
}

字符串枚举

字符串枚举是一种用字符串值初始化的枚举。

typescript
enum Direction {
  Up = 'UP',
  Down = 'DOWN',
  Left = 'LEFT',
  Right = 'RIGHT',
}

异构枚举

异构枚举是数字枚举和字符串枚举的混合。(虽然符合TS语法,但不建议这么做)

异构枚举有一个特殊的行为,任何字符串枚举项之后的所有成员都必须显式赋值,因为打断了TS的默认递增规则):

typescript
enum Color {
  Red, // 0
  Yellow, // 1
  Green = 'GREEN', // 打断了TS的递增规则
  Blue = 9, // 此时必须显式赋值
  White, // 10
}

枚举的合并

(同名)枚举可以合并,合并后的枚举会包含所有枚举的属性。

typescript
enum Direction {
  Up = 'UP',
  Down = 'DOWN',
}

enum Direction {
  Left = 'LEFT',
  Right = 'RIGHT',
}

// 此时的Direction等价于:
// enum Direction {
//   Up = 'UP',
//   Down = 'DOWN',
//   Left = 'LEFT',
//   Right = 'RIGHT',
// }

但是枚举合并有以下几种限制:

  • 只允许其中一个的首成员省略初始值
  • 不能有同名成员
  • 所有定义必须同为 const 枚举或者非 const 枚举,不允许混合使用。

由于这些限制,实际开发中不推荐枚举合并,而且会导致代码可读性变差。

keyof获取枚举键

keyof 运算符可以取出 Enum 结构的所有成员名,作为联合类型返回。

typescript
enum Direction {
  Up = 'UP',
  Down = 'DOWN',
  Left = 'LEFT',
  Right = 'RIGHT',
}

type DirectionKeys = keyof typeof Direction // 'Up' | 'Down' | 'Left' | 'Right'

反向映射

枚举类型的值可以通过枚举的键来获取,这种映射关系是双向的。

typescript
enum Direction {
  Up,
  Down,
  Left,
  Right,
}

console.log(Direction[2]) // 'Left'