• ts枚举的两种类型是什么?


    1.数字枚举和字符枚举

    TS中支持两种枚举, 一种是数字枚举, 一种是字符串枚举。
    (1)数字枚举
    默认情况下就是数字枚举。

    	enum Gender{
    	    Male,
    	    Female
    	}
    	console.log(Gender.Male);
    	console.log(Gender.Female);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    注意点:
    数字枚举的取值默认从0开始递增。
    数字枚举的取值可以是字面量, 也可以是常量, 也可以是计算的结果。

    	const num = 666;
    	function getNum() {
    	    return 888;
    	}
    	enum Gender{
    	    // Male = 6,
    	    // Male = num, 
    	    // 注意点: 如果使用常量给前面的枚举值赋值了,那么后面的枚举值也需要手动的赋值
    	    // Female = 8
    	    Male = getNum(), 
    	    // 注意点: 如果使用计算结果给前面的枚举值赋值了, 那么后面的枚举值也需要手动的赋值
    	    Female = 123
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    (2)枚举反向映射

    	enum Gender{
    	    Male,
    	    Female
    	}
    	console.log(Gender.Male); // 0
    	console.log(Gender[0]); // Male
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (3)字符串枚举

    	enum Gender{
    	    Male = 'www.it666.com',
    	    Female = 'www.itzb.com' 
    	    // 注意点: 如果使用字符串给前面的枚举值赋值了,那么后面的枚举值也必须手动赋值
    	}
    	console.log(Gender.Male);
    	console.log(Gender.Female);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注意点:
    如果使用字符串给前面的枚举值赋值了, 那么后面的枚举值也必须手动赋值。
    和数字枚举不一样, 字符串枚举不能使用常量或者计算结果给枚举值赋值。
    虽然字符串枚举不能够使用常量或者计算结果给枚举值赋值, 但是它可以使用内部的其它枚举值来赋值。

    	const str = 'lnj';
    	function getStr() {
    	    return 'abc';
    	}
    	enum Gender{
    	    Male = 'www.it666.com',
    	    // Male = str,
    	    // Male = getStr(),
    	    Female = 'www.itzb.com',
    	    Yao = Female
    	}
    	console.log(Gender.Female);
    	console.log(Gender.Yao);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    (4)异构枚举
    枚举中既包含数字又包含字符串, 我们就称之为异构枚举。

    	enum Gender{
    	    Male = 6,
    	    Female = 'nv'
    	}
    	console.log(Gender.Male);
    	console.log(Gender.Female);
    	console.log(Gender[6]);
    	// 注意点: 如果是字符串枚举, 那么无法通过原始值获取到枚举值
    	// console.log(Gender['nv']);
    	console.log(Gender)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.枚举成员类型和联合类型

    (1)枚举成员类型
    我们可以把枚举成员当做类型来使用。

    	enum Gender{
    	    Male = 'www.it666.com',
    	    Female = 'www.itzb.com'
    	}
    	interface TestInterface {
    	    age: Gender.Male
    	}
    	class Person implements TestInterface{
    	    age: Gender.Male
    	    // age: Gender.Female // 由于类型不匹配, 所以会报错
    	    // age: 0 // 注意点: 由于数字枚举的本质就是数值, 
    	所以这里写一个数值也不会报错
    	
    	    // age: Gender.Male
    	    // age: Gender.Female
    	    // age: 'www.it666.com' // 注意点: 如果是字符串枚举, 
    	那么只能是枚举成员的值, 不能是其它的值
    	    // age: string
    	}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    (2)联合枚举类型
    联合类型就是将多种数据类型通过|连接起来。

    	let value:(number | string); // (number | string)联合类型
    	value = 1;
    	value = 6;
    	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
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    3.运行时枚举和常量枚举

    (1)运行时枚举
    枚举在编译之后是一个真实存储的对象, 所以可以在运行时使用。
    而像接口这种只是用来做约束做静态检查的代码, 编译之后是不存在的。

    	interface TestInterface {
    	    name:string;
    	    age:number;
    	}
    	enum Gender{
    	    Male,
    	    Female
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    (2)常量枚举
    普通枚举会生成真实存在的对象。
    常量枚举不会生成真实存在的对象, 而是利用枚举成员的值替换使用到的地方。

    	enum Gender1{
    	    Male,
    	    Female
    	}
    	console.log(Gender1.Male === 0);
    	
    	const enum Gender2{
    	    Male,
    	    Female
    	}
    	console.log(Gender2.Male === 0);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    阅读终点,创作起航,一起加油!

  • 相关阅读:
    上位机工作感想-从C#到Qt的转变-2
    企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图
    MySQL Workbench 使用MySQL语法“创建表格以及插入数据”
    基于内容的个性化推荐算法
    FallO’ween 活动:元宇宙中秋天与万圣节的邂逅
    java毕业设计大学生心愿墙系统Mybatis+系统+数据库+调试部署
    JS教程之 ElectronJS 自定义标题栏
    2023年全球及中国小分子化药CDMO市场发展概况分析:CDMO市场有望进一步扩大[图]
    API自动化(七)
    N-羟乙基-1,8-萘二甲酰亚胺四苯乙烯衍生物聚集诱导发光微球/AIE席夫碱化合物的研究制备
  • 原文地址:https://blog.csdn.net/ZXH0122/article/details/132757469