知识点列表
数字枚举
没有初始化值,默认从0开始自增
enum Direction {
Up,
Down,
Left,
Right,
}
console.log(Direction.Up, Direction.Down, Direction.Left, Direction.Right); //0 1 2 3
初始化第一个值,从初始化的值开始自增
enum Direction {
Up = 1,
Down,
Left,
Right,
}
console.log(Direction.Up, Direction.Down, Direction.Left, Direction.Right); //1 2 3 4
初始化中间值,没有初始化的值依然从0开始自增, 如果前面的枚举成员有数字常量初始化。 在这种情况下,当前枚举成员的值将是前一个枚举成员的值加1。
enum Direction {
Up,
Down = 3,
Left,
Right,
}
console.log(Direction.Up, Direction.Down, Direction.Left, Direction.Right); //0 3 4 5
字符串枚举
在字符串枚举中,每个成员都必须使用字符串文字或另一个字符串枚举成员进行常量初始化。
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
}
合成枚举
从技术角度来说,是可以定一个枚举包括字母和数字类型的。官方建议不要这样做,除非你想要巧妙地利用JavaScript运行时行为。
enum BooleanLikeHeterogeneousEnum {
No = 0,
Yes = "YES",
}
计算成员和常量成员
以下几种情况属于常量成员
1.字面枚举表达式(基本的string或 number)
2.对其他枚举的成员或自身枚举成员的引用
3.带括号的常量枚举表达式
4.常量枚举表达式中使用一元运算符 +, -, ~
5.以常量枚举表达式作为操作数的二进制运算符 +, -, *, /, %, <<, >>, >>>, &, |, ^
不属于上面情况的都是计算成员
enum FileAccess {
// 常量成员
None,
Read = 1 << 1,
Write = 1 << 2,
ReadWrite = Read | Write,
Left = Direction.Left,
// 计算成员
G = "123".length
}
枚举成员作类型
enum ShapeKind {
Circle,
Square,
}
interface Circle {
kind: ShapeKind.Circle;
radius: number;
}
interface Square {
kind: ShapeKind.Square;
sideLength: number;
}
let c: Circle = {
kind: ShapeKind.Square, // Error! 类型 'ShapeKind.Square' 不能赋值给类型'ShapeKind.Circle'.
radius: 100,
}
运行时枚举
枚举是运行时存在的真实对象
enum E {
X, Y, Z
}
function f(obj: {Y: number}) {
console.log(obj.Y);
}
f(E); // 1
编译时枚举
enum LogLevel {
ERROR, WARN, INFO, DEBUG
}
/**
* This is equivalent to:
* type LogLevelStrings = 'ERROR' | 'WARN' | 'INFO' | 'DEBUG';
*/
type LogLevelStrings = keyof typeof LogLevel;
function printImportant(key: LogLevelStrings, message: string) {
const num = LogLevel[key];
if (num <= LogLevel.WARN) {
console.log('Log level key is: ', key);
console.log('Log level value is: ', num);
console.log('Log level message is: ', message);
}
}
printImportant('ERROR', 'This is a message');
反向映射 (仅仅适用于数字枚举)
enum Enum {
A
}
let a = Enum.A;
let nameOfA = Enum[a];
const枚举
const enum Enum {
A = 1,
B = A * 2
}
console.log(Enum.A, Enum.B); // 1 2
环境枚举
环境枚举用于描述已经存在的枚举类型的形状。
declare enum Enum {
A = 1,
B,
C = 2
}