利用枚举类型如何实现表驱动法
(表驱动法帮助我们简化代码并且逻辑看上去更清爽)
条件判断语句很多的时候用if else哪怕是switch 可读性都是很差的,不好看
用枚举类型对它进行优化
枚举类型用enum这样一个关键字来修饰,跟对象很相似但是没有=号,里面可以定义不同的状态,用不同的变量去定义不同的状态,方便别人阅读,起到了文档的作用。但还是有if else还是不够简洁,用表驱动就是为了干掉if,else和switch,因为那样的写法会把很多的逻辑耦合到一起。
表驱动,
定义一个对象,然后定义类型的时候用Record ,高级类型,Record<number,(order:Order)=>void=>{} record可以理解为js中object,key是number类型,value是function的类型,有点像映射,一对一。
数字枚举
本身就是数字 不写默认从0开始 OrderStatus3{Pending=3}
字符串枚举
enum OrderStatus3{Pending="pending"}
易构枚举
enum OrderStatus3{Pending,completed='completed'}
没有指定的就是0,指定了的就变成了字符串,不定义的放中间就不行,因为它不知道从几开始
枚举成员的类型不能是function
enum Obj{a,b=Obj.a,c=Math.random(),d=1+2,e=()=>false}最后那个会报错
//常量枚举 并不会转译成任何的js代码 ,只有在常量使用的时候才会进行转译,少生成JS代码
const enum ConstOrderStatus{Pending,Shipped}
//基本的枚举是会转译成js代码的,会生成一个类似于对象的东西
enum ConstOrderStatus{Pending,Shipped}
ConstOrderStatus.Pending=233 会报错,是只读的,不能这样修改
常量枚举和基本枚举不能比较。其它枚举不同的元素也不能进行比较
数字枚举、字符串枚举、异构枚举
常量枚举:不转译枚举,代码较少
每个枚举属性都是只读的,不能赋值
表驱动
表驱动
// 枚举 enum OrderStatus1{ Pending, Shipped, Completed, Cancelled, Unknown } //-------0 1 2 3 4 // 数字枚举 enum OrderStatus2{ Pending=3, Shipped, Completed=8, Cancelled, Unknown } //---------3 4 8 9 10 // 字符串枚举 enum OrderStatus3{ Pending='Pending', Shipped='Shipped', Completed='Completed', Cancelled='Cancelled', Unknown='Unknown' } // 异构枚举 enum OrderStatus4{ Pending, Shipped, Completed='Completed', Cancelled='Cancelled', Unknown='Unknown' } //------0 1 Completed Cancelled Unknown
枚举类型
1、数字枚举
enum numEnum{ Pending, // 0 Shipped, // 1 Completed, // 2 Cancelled, // 3 Unknown // 4 }
2、字符串枚举
enum strEnum{ Pending = 'Pending', Shipped = 'Shipped', Completed = 'Completed', Cancelled = 'Cancelled', Unknown = 'Unknown' }
3、异构枚举
// 异构枚举就是枚举值中成员值既有数字类型又有字符串类型(但是不能有值是空的) // 异构 isomerism enum isomerismEnum{ Pending = 'Pending', Shipped = 'Shipped', Completed = 2, Cancelled = 'Cancelled', Unknown = 'Unknown' }
4、常量枚举
// 常量枚举,就是在定义枚举的语句之前加上const 关键字,这样编译后的代码不会创建这个对象,只是会从枚举里拿到相应的值进行替换 enum Status { Off, On } const enum Animal { Dog, Cat } const status = Status.On; const animal = Animal.Dog;
上面的代码编译成 JavaScript 之后是这样的:
var Status; (function(Status) { Status[(Status["Off"] = 0)] = "Off"; Status[(Status["On"] = 1)] = "On"; })(Status || (Status = {})); var status = Status.On; var animal = 0; // Dog
注意,枚举值是只读的,不能够修改。
二、表驱动
表驱动,就是为了去除if...else.. 和switch 这种语法的。
1,表驱动:
const orderHandlers: Record<number, (order: Order)=> void> = {
[OrderStatus.Pending]: function (order){
},
[OrderStatus.Shipped]: function (order){
},
}
2,枚举类型、常量枚举 区别在于生成 JS 代码, 常量枚举使用常量替换类型。
enum OrderStatus{
}
const enum OrderStatus{
}