TS学习(五) :TS枚举的使用

扩展类型有那些?
类型别名
枚举
接口

类型别名之前已经接触了就不再过多解释,这里主要学习的是枚举

枚举
一般是后端语言的东西,这里学过后端都应该了解,枚举通常用于约束某个变量的取值范围。

像开发一些游戏的上下左右的操作可以用枚举,还有定义用户的性别也可以用枚举,

用户的性别这里之前我们是用的是字面量和联合类型配合使用,也可以达到同样的目标。

但是为什么还要用到枚举呢?这肯定是在用字面量和联合类型配合使用时遇到了问题,所以才不得不使用枚举,什么问题呢

字面量类型的问题

1、在类型约束位置、会产生重复代码。可以使用类型别名解决该问题,如下

例子:

let gender: "男" | "女";
gender="男";
gender="女";
function searchUser(g:"男" | "女"){
//...doing something
}


2、逻辑含义和真实的值产生了混淆,会导致当修改真实值的时候,产生大量的修改

例子:

type Gender ="男" | "女"
let gender: Gender;
//do something 很多代码
if(true){
  gender="男";
}else{
  gender="女";
}
function searchUser(g:Gender){
//...doing something
}


这个时候如果有需求说不要用男女来表示,用其他的比如帅哥/美女,这样改的地方就会很多如 Gender ="帅哥" | "美女",

其他地方给gender变量赋值的也得改不然会报错,万一写了成百上千行代码,这改起来就很麻烦

3、字面量类型不会进入到编译结果,而枚举可以

定义枚举

enum 枚举名 {
    //枚举字段1=值1
    //枚举字段2=值2
}
在赋值的时候,像使用对象一样

// 如
enum Gender {
    male = "男",
    female = "女"
}
let gender: Gender;
//do something 很多代码
if(true){
    gender= Gender.male;
}else{
    gender=Gender.female;
}
function searchUser(g:Gender){
    //...doing something
}


编译完成后的代码 由于”男女“是中文转义了,所以使用枚举是可以被编译的

var Gender;
(function (Gender) {
    Gender["male"] = "\u7537";
    Gender["female"] = "\u5973";
})(Gender || (Gender = {}));
var gender;
//do something 很多代码
var number = Math.random() > 0.5;
if (number) {
    gender = Gender.male;
}
else {
    gender = Gender.female;
}


如果想要改值也仅仅只需要改 Gender里面的值就行了,其他的不需要动,

当然如果说把逻辑值male|female改了,那没办法得全局改了

enum Gender {
    male = "先生",
    female = "女士"
}


枚举的规则
枚举的字段值可以是字符串,也可以是数字

enum Level{
    level1=1,
    level2=2,
    level3=3
}


数字枚举的值会自动自增,如果第一个值不赋值,则第一个值为0,后面依次递增

enum Level{
    level1=1,
    level2,
    level3
}
let l:Level = Level.level1;
l = Level.level2
console.log(l)//打印结果是2


被数字枚举约束的变量,可以直接赋值为数字,这样的方法不建议使用,这样又在使用真实值

  enum Level{
      level1,
      level2,
      level3
  }
  let l:Level = 1;
  l = 2
  console.log(l)//打印结果是2


数字枚举的编译结果 和 字符串枚举有差异

   

 //编译后的结果
    var Level;
    (function (Level) {
    Level[Level["level1"] = 1] = "level1";
    Level[Level["level2"] = 2] = "level2";
    Level[Level["level3"] = 3] = "level3";
    })(Level || (Level = {}));
    var l = Level.level1;
    l = Level.level2;


不要在一个枚举中既出现数字,又出现字符串

使用枚举时,尽量使用枚举的字段名称,而不使用真实值

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值