数字和字符串枚举
- TS中支持两种枚举,一种是数字枚举,一种是字符串枚举
1.数字枚举
- 默认情况下就是数字枚举
- 数字枚举的取值默认从0开始递增
- 数字枚举的取值可以是字面量,也可以是常量,也可以是计算的结果
- 如果使用常量或计算结果给前面的枚举值赋值了,那么后面的枚举值也需要手动赋值
const num = 666
function getNum(){
return 888
}
enum Gender{
A = num,
Male = 6,
Female = getNum()
}
console.log(Gender.Male) // 0
console.log(Gender.Female) // 1
2.枚举反向映射
- 可以根据枚举值获取到原始值
- 也可以根据原始值获取到枚举值
enum Gender{
Male,
Female
}
console.log(Gender.Male) // 0
console.log(Gender[0]) // Male
3.字符串枚举
- 如果使用字符串给前面的枚举值赋值了,那么后面的枚举值也需要手动赋值
- 和数字枚举不一样,字符串枚举不能使用常量或计算结果给枚举值赋值
- 虽然字符串不能使用常量或计算结果给枚举值赋值,但是它可以使用内部其他的枚举值来赋值
const str = 'abc'
function getStr(){
return 'abc'
}
enum Gender{
Male = 'male',
Female = 'female',
Yaounde= Male
// Male = str, // 报错
//Female = getStr() // 报错
}
console.log(Gender.Male) // male
console.log(Gender.Female) // female
console.log(Gender.Yao) // male
4.异构枚举
- 枚举中既包含数字又包含字符串,就称之为异构枚举
- 如果是字符串枚举,那么无法通过原始值获取到枚举值
enum Gender{
Male = '666',
Female = 'female',
}
console.log(Gender.Male) // 666
console.log(Gender.Male) // female
console.log(Gender['female']) // undefined
枚举成员类型和联合枚举类型
1.枚举成员类型
enum Gender{
Male,
Female
}
interface TestInterface{
age:Gender.Male
}
class Person implements TestInterface{
//age:Gender.Male
//age:Gender.Female // 由于类型不匹配,所以会报错
age:0 // 由于数字枚举的本质就是数值,所以在这里写一个数值也不会报错、
//注意点:如果是字符串枚举,那么只能是枚举成员的值,不能是其他的值
}
2.联合枚举类型
2.1什么是联合类型?
let value:(number | string)
value = 1
value = '123'
enum Gender{
Male,
Female
}
interface TestInterface {
age:Gender // age:(Gender.Male|Gender.Female)
}
class Person implements TestInterface {
//age:Gender.Male
age:Gender.Female
}
运行时枚举和常量枚举
1.运行时枚举
- 枚举在编译之后是一个真实存储的对象,所以可以在运行时使用
- 而像接口这这种只是用来做约束静态检查的代码,编译之后是不存在的
2.常量枚举
- 普通枚举和常量枚举的区别:
- 普通枚举会生成真实存在的对象
- 常量枚举不会生成真实存在的对象,而是利用枚举成员的值直接替换使用到的地方
enum Gender1{
Male,
Female
}
console.log(Gender1.Male === 0)
const enum Gender2{
Male,
Female
}
console.log(Gender2.Male)