typescript的真实用意与使用场景

第一次用

我以为只是普通的用来方便下次查找
所以这个没有报错

enum Mor{ boy='男', girl='女', gay='保密' }
let xxoo:Mor = Mor.a
console.log(`${xxoo}找家长`)

第二次

发现报错,后来我想他是不是只能用于数字?
但是如果a只是赋一个Mor.a就不会报错

image.png

enum Mor{ a="常吉孔", b="范道矮", c="博多叶" }

let a:Mor = Mor.a +`-`+ Mor.b +"-"+ Mor.c
console.log(`${a}好学生`)

提问:

这个枚举是不是只能像调用数据接口一样。只能在对象中使用
像是这样

var p = {
  a: Mor.a,
  b:Mor.b,
  c:Mor.c
}
阅读 3.4k
2 个回答

一楼说的是对的。枚举其实是直接用的。之所以教你的人,在变量的屁股后面加Color是因为他想借用你当前枚举值是什么类型。再直白的说他就是为了let a: number。
而懒得写,直接带你的Color过去了。所以对你产生了误解!!!!

看了前述及回答,我觉得这里可能存在一些理解上的误区。

变量名屁股后面加枚举名,不是没有意义,而是限制该变量的类型是该枚举类型。这和把变量声明为其他类型是一样的作用。TypeScript 存在的最大意义就是基于类型约束提供静态语法检查。


枚举的意义在于提供“有限值集”,通俗的说就是提供一组值,并且限定该类型的取值范围。一般情况下枚举都是以数值形式定义,方便计算,但这种方式同时也会存在一些用法会“打破限制”。TypeScript 允许定义字符串类型的枚举。对于数值型枚举和字符串型枚举,在使用和限制上都是有区别的。

而且枚举在 TypeScript 中比较特殊,它不仅是一个类型,也是包含值集,也就是说,枚举值是可以当作常量直接用的(还有常量枚举语法,有兴趣可以去查)。在 TypeScript Playground 中可以看到枚举会编译成一个 JavaScript 对象。


先说字符串类型枚举,也就是题主的疑问。

enum Mor {
    boy = "男",
    girl = "女",
    gay = "保密"
}
let xxoo: Mor = Mor.a;
//                  ^ 这里有错

console.log(`${xxoo}找家长`);

这里定义的枚举没有问题,但在使用的时候出现了问题。前面说到,枚举是有限值集,而 Mor.a 明显未定义。

然后接下来的问题是,如果枚举值参加了运算:

let v: Mor = Mor.boy + " | " + Mor.girl + " | " + Mor.gay
//  ^^^^^^ 这里有问题

这里 Mor 枚举的值是字符串,字符串相加得到字符串。在对字符串型枚举值进行运算时,会把枚举传当作字符串来运算,字符串连接运算的结果当然只能是 string,而不是枚举。


接下来说数值型枚举,数值枚举的定义和其他一些语言相似,可以不指定值,直接从 0 开始(当然也可以指定,有自增规则)

enum Test {
    A, B, C, D
}

const v: Test = Test.B + Test.D;

数值型枚举枚举值是 number 的子类型,但是它们相加的结果即可以赋值给相同的枚举类型,哪些结果不在值集中,如上例,Test.B + Test.D 的结果是 4,并不在 Test 的值集范围内。

这个原因可以追溯很远,但最重要的是,这样才能兼容枚举值“按位组合”的情况。比如我们想用 Test 来表示 4 个开关的状态,可以这样重新定义这个枚举:

enum Test {
    A = 1,
    B = 2,
    C = 4,
    D = 8
}

他们任意两个值相加都可以表示这组开关的状态。比如

const v: Test = Test.B | Test.D;    // v = 10
const bOn = v & Test.B;   // v = 2,非 0 表示开
const cOn = v & Test.C;   // v = 0, 表示关

这样拿到一个状态数据就可以很容易算出来任意一个开关的状态。但是很显示,这么多组合如果都要去定义枚举值,是件很累的事情,所以,在这个问题上,语法放宽到了 number 类型,允许把 number 值看作数值型枚举值。

就算直接给数值型枚举类型变量赋数值都是可以的:const x: Test = 1234;


TypeScript 的枚举还包含混合枚举,但与本问题无关,不赘述了。如果想更详细的了解 TypeScript 枚举,可以去看我的视频教程

TypeScript从入门到实践 【2021 版】| 6.2 枚举类型 (32分钟)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题