TS的扩展类型-枚举

111 阅读2分钟

扩展类型 - 枚举

扩展类型:类型别名、枚举、接口、类

枚举通常用于约束某个变量的取值范围。

字面量和联合类型配合使用,也可以达到同样的目标。

字面量类型的问题

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

        type Gender = '男' | '女';
        let gender: Gender;
        gender = '男';
        gender = '女';
        function searchUser(g: Gender) {}
    

    使用类型别名后,是可以解决上述问题,当时,当我们要修改Gender的取值时,我们要修改gender的真实值,当代码很多的时候,会显得很繁琐。

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

    那么什么是逻辑含义和真实值呢。逻辑含义的意思是本身,它的真实值可以是男士女士,也可以是帅哥美女,但逻辑含义是不会变化的。 因为可能遇到修改真实值的情况,使用字面量类型不是最优选择,因而会有枚举这种方式。

        enum Gender {
            male = '男',
            female = '女'
        }
        let gender: Gender;
        gender = Gender.male;
        gender = Gender.female;
        function searchUser(g: Gender) {}
    
  • 字面量类型不会进入编译结果。

    使用字面量类型的编译结果。

        let gender;
        gender = '男';
        gender = '女';
        function searchUser(g) { }
    

    使用枚举的编译结果。

        var Gender;
        (function (Gender) {
            Gender["male"] = "\u7537";
            Gender["female"] = "\u5973";
        })(Gender || (Gender = {}));
        let gender;
        gender = Gender.male;
        gender = Gender.female;
        function searchUser(g) { }
    

    使用枚举的编译结果中增加了一个立即执行函数,参数是Gender。这意味着枚举是参与到函数运行中的,并且是作为一个对象。基于此,在ts代码中就可以输出Gender的属性值。

枚举

如何定义一个枚举

enum 枚举名 {
    枚举字段1 = 值1,
    枚举字段2 = 值2
}

枚举会出现到编译结果中。

枚举的规则:

  • 枚举的字段值可以是字符串或数字 数字枚举的值会自动自增,默认为1,默认依次递增,也可以用相应的规则,如1,2,4,8

  • 被数字枚举约束的变量,可以直接赋值为数字(最好不用,尽量使用逻辑名称)。

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

        enum Level {
            level1 = 1,  
            level2 = 2,
            level3 = 3
        }
        let l: Level;
        l = Level.level1;
        console.log(l);
        console.log(Level)
    

    编译结果

        var Level;
        (function (Level) {
            Level[Level["level1"] = 1] = "level1";
            Level[Level["level2"] = 2] = "level2";
            Level[Level["level3"] = 3] = "level3";
        })(Level || (Level = {}));
        let l;
        l = Level.level1;
        console.log(l);
        console.log(Level)
    

    如果是数字枚举,编译结果输出的Level是

         {
              '1': 'level1',
              '2': 'level2',
              '3': 'level3',
              level1: 1,
              level2: 2,
              level3: 3
         }
    

    如果是字符串类型,则为

          { level1: '1', level2: '2', level3: '3' }
    

最佳实践

  • 尽量不要在一个枚举中既出现字符串字段,又出现数字字段。
  • 使用枚举时,尽量使用枚举字段的名称,而不是真实的值

使用枚举完善打印扑克牌例子github