首页 前端知识 TS-枚举

TS-枚举

2024-05-13 10:05:10 前端知识 前端哥 355 891 我要收藏

1.数字枚举和字符枚举

TS中支持两种枚举, 一种是数字枚举, 一种是字符串枚举。

(1)数字枚举

默认情况下就是数字枚举。

	enum Gender{
	    Male,
	    Female
	}
	console.log(Gender.Male);
	console.log(Gender.Female);

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

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

(2)枚举反向映射

	enum Gender{
	    Male,
	    Female
	}
	console.log(Gender.Male); // 0
	console.log(Gender[0]); // Male

(3)字符串枚举

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

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

	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);

(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);

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
	}

(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
	}

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

(1)运行时枚举

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

	interface TestInterface {
	    name:string;
	    age:number;
	}
	enum Gender{
	    Male,
	    Female
	}

(2)常量枚举

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

	enum Gender1{
	    Male,
	    Female
	}
	console.log(Gender1.Male === 0);
	
	const enum Gender2{
	    Male,
	    Female
	}
	console.log(Gender2.Male === 0);
转载请注明出处或者链接地址:https://www.qianduange.cn//article/8490.html
标签
评论
会员中心 联系我 留言建议 回顶部
复制成功!