enum类型是对JavaScript标准数据类型的一个补充。枚举是一种特殊的对象,其成员是有名字的常量。这些值可以是数字或字符串。
默认情况下,从0开始为元素编码,也可以手动指定成员的数值
enum Color{Red,Green,Blue}
let c:Color=Color.Green
//手动指定成员的数值
enum Color{Red=1,Green,Blue}
enum Color{Red=1,Green=2,Blue=4}
1.数字枚举
enum Direction{
Up,
Down,
Left,
Right
}
增长枚举
定义了一个数字枚举, Up
使用初始化为 1
。 其余的成员会从 1
开始自动增长。
enum Direction{
Up=1,
Down,// 自动增长,此处为2
Left,// 自动增长,此处为3
Right// 自动增长,此处为4
}
字符串枚举
enum Direction{
Up="UP",
Down="DOWN",
Left="LEFT",
Right="RIGHT"
}
异构枚举
枚举可以混合字符串和数字成员,除非你真的想要利用JavaScript运行时的行为,否则我们不建议这样做。
enum Direction{
No=0,
Yes='YES'
}
计算成员和常量成员
每个枚举成员都有一个与之关联的值,可以是常量或计算值。在以下情况下,枚举成员被认为是常量:
1)它是枚举中第一个成员,并且没有初始化器,这种情况下它被赋予值0
//E.X is constant
enum E{
X
}
2)它没有初始化程序,并且前面的枚举成员是一个数字常量,在这种情况下,当前枚举成员的值将是前一个枚举成员的值加一
//All enum members in 'E1' and 'E2' are constant.
enum E1{
X,
Y,
Z
}
enum E2{
A=1,
B,
C
}
3)枚举成员使用 常量枚举表达式进行初始化。常量枚举表达式是TypeScript表达式的自己,它可以在编译阶段求值。当一个表达式满足小面条件之一时,它就是一个常量枚举表达式:
- 一枚举表达式字面量(主要是字符串字面量或数字字面量)
- 一个对之前定义的常量枚举成员的引用
- 带括号的常量表达式
- 一元运算符+ ,- ,~ 其中之一应用在了常量枚举表达式
- 常量枚举表达式作为二元运算符
+
,-
,*
,/
,%
,<<
,>>
,>>>
,&
,|
,^
的操作对象。若常数枚举表达式求值后为NaN
或Infinity
,则会在编译阶段报错。
enum FileAccess{
//constant members
None,
Read = 1 << 1,
Write = 1 << 2,
ReadWrite =Read | Write,
//computed member
G = "123".length
}
接口枚举
定义一个枚举Types,定义一个接口A,他有一个属性red值为Types.yyds
enum Types{
yyds,
dddd
}
interface A{
red:Types.yyds
}
let obj:A={
red:Types.yyds
}
联合枚举
enum E{
Foo,
Bar
}
functin f(x:E){
if(x!==E.Foo ||x!==E.Bar){
// This condition will always return 'true' since the types 'E.Foo' and 'E.Bar' have no overlap.
}
}
运行时的枚举
枚举是运行时存在的真实对象
enum E{
X,
Y,
Z
}
function f(obj:{X:number}){
return obj.X
}
//有效,因为“E”有一个名为“X”的属性,它是一个数字。
f(E)
编译时的枚举
使用keyof typeof获取将所有Enum键表示为字符串的类型
enum LogLevel{
ERROR,
WARN,
INFO,
DEBUG
}
/**
*这相当于:
*type LogLevelStrings='ERROR'|'WARN'|'INFO'|'DEBUG';
*/
type LogLevelStrings= keyof typefo LogLevel;
function printImportant(key:LogLevelStrings,messag: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")
const枚举
const enum Enum{
A=1,
B=A*2
}
反向映射
它包含了正向映射(name->value)和反向映射(value->name)
要注意的是不会为字符串枚举成员生产反向映射
enum Types{
success
}
let success:number=Types.success
let key=Types[success]
console.log(key) //sucess
外部枚举(环境枚举)
外部枚举用来描述已经存在的枚举类型的形状
declare enum Enum{
A=1,
B,
C=2
}
对象与枚举
枚举类型不可以被修改,枚举是一个只读类型的对象。除此之外还有数字枚举和反向映射,要注意的是不会为字符串枚举成员生成反向映射。
const enum EDirection{
Up,
Down,
Left,
Right
}
const oDirection:{
Up:0,
Down:1,
Left:2,
Right:3
} as const
EDirection.up //(enum member) EDirection.Up = 0
oDirection.up //(property) Up: 0
function walk(dir:EDirection){}
type Direction=typeof oDirection[keyof typeof oDirection];
function run(dir:Direction){}
walk(EDirection.Left);
run(ODirection.Right);