TypeScript编程03-枚举文章目录TypeScript编程03-枚举一、枚举基础概念Q1什么是枚举EnumQ2TypeScript 支持哪几种枚举类型二、数字枚举详解Q3数字枚举的默认值是如何分配的Q4如何自定义数字枚举的起始值Q5数字枚举支持反向映射吗三、字符串枚举详解Q6如何定义字符串枚举Q7字符串枚举的优势是什么四、枚举的使用技巧Q8如何获取枚举的所有键或值Q9如何遍历枚举五、常量枚举与计算成员Q10什么是 const enum常量枚举Q11什么是计算成员六、枚举与类型系统Q12枚举作为类型如何使用Q13联合枚举类型是什么七、枚举的局限与替代方案Q14枚举有哪些缺点Q15什么场景下应该用对象字面量替代枚举八、常见问题速查Q16枚举成员可以是哪些类型Q17如何比较枚举值Q18如何提取枚举的值类型总结对比表一、枚举基础概念Q1什么是枚举EnumA枚举是一种数据结构用于定义一组命名的常量集合。TypeScript 提供了基于数字和字符串的枚举让代码更具可读性和可维护性。enumDirection{Up,Down,Left,Right}Q2TypeScript 支持哪几种枚举类型A三种主要类型类型说明数字枚举默认从 0 开始自增可自定义初始值字符串枚举每个成员必须是字符串字面量异构枚举混合数字和字符串不推荐二、数字枚举详解Q3数字枚举的默认值是如何分配的A默认从0开始依次自增1。enumStatus{Pending,// 0Approved,// 1Rejected// 2}Q4如何自定义数字枚举的起始值A给第一个成员赋值后续成员自动递增。enumHttpStatus{OK200,Created,// 201BadRequest,// 400? 不对是 201NotFound404,Error// 405}Q5数字枚举支持反向映射吗A支持。可以通过值获取名称。enumColor{Red1,Green,Blue}console.log(Color.Red);// 1console.log(Color[1]);// Red ← 反向映射console.log(Color[Red]);// 1⚠️注意字符串枚举不支持反向映射三、字符串枚举详解Q6如何定义字符串枚举A每个成员必须显式赋值为字符串。enumDirection{UpUP,DownDOWN,LeftLEFT,RightRIGHT}Q7字符串枚举的优势是什么A可读性强运行时值是有意义的字符串调试友好打印出来直接看懂序列化方便与 JSON 兼容性好// 对比enumNumDir{Up,Down}// 运行时: Up 0enumStrDir{UpUP}// 运行时: Up UPJSON.stringify(StrDir.Up)// UP ✅JSON.stringify(NumDir.Up)// 0可读性差⚠️四、枚举的使用技巧Q8如何获取枚举的所有键或值AenumStatus{Active1,Inactive0}// 获取所有键包括反向映射的键仅数字枚举Object.keys(Status);// [1, 0, Active, Inactive]// 过滤只获取字符串键Object.keys(Status).filter(keyisNaN(Number(key)));// [Active, Inactive]// 获取所有值Object.values(Status);// [Active, Inactive, 1, 0]Q9如何遍历枚举AenumColor{RedRED,GreenGREEN}// 字符串枚举遍历for(constkeyinColor){console.log(${key}:${Color[key]});}// 输出: Red: RED, Green: GREEN// 数字枚举遍历注意会包含反向映射enumNumColor{Red1,Green}for(constkeyinNumColor){if(isNaN(Number(key))){// 过滤数字键console.log(${key}:${NumColor[key]});}}五、常量枚举与计算成员Q10什么是const enum常量枚举A编译时完全内联不生成对象提升性能。constenumDirection{Up1,Down2}letdirDirection.Up;// 编译后: let dir 1 /* Up */; 直接替换为值⚠️限制不能包含计算成员且编译后无法访问Direction对象。Q11什么是计算成员A运行时才能确定的值。enumFileAccess{None0,Read11,// 2 位运算Write12,// 4ReadWriteRead|Write,// 6 引用其他枚举成员G123.length// 3 表达式}六、枚举与类型系统Q12枚举作为类型如何使用A枚举本身是一种类型。enumStatus{Success200,Error500}functionhandle(status:Status){// 参数类型为枚举if(statusStatus.Success){console.log(成功);}}handle(Status.Success);// ✅handle(200);// ✅ 数字枚举允许字面量handle(404);// ❌ 错误404 不是 Status 的成员Q13联合枚举类型是什么A枚举成员可以作为类型使用。enumShapeKind{Circlecircle,Squaresquare}interfaceCircle{kind:ShapeKind.Circle;// 只能是 circleradius:number;}interfaceSquare{kind:ShapeKind.Square;// 只能是 squaresideLength:number;}七、枚举的局限与替代方案Q14枚举有哪些缺点A缺点说明代码体积编译后生成双向映射对象增加体积类型安全数字枚举允许任意数字赋值status: Status 999不报错Tree Shaking普通枚举难以被优化掉命名空间污染枚举名和值都在作用域内Q15什么场景下应该用对象字面量替代枚举A推荐用as const对象替代简单枚举。// ❌ 传统枚举enumColors{RedRED,BlueBLUE}// ✅ 推荐const 断言对象更轻量类型更安全constColors{Red:RED,Blue:BLUE}asconst;typeColortypeofColors[keyoftypeofColors];// RED | BLUE优势无编译开销更好的 Tree Shaking真正的字面量类型推导八、常见问题速查Q16枚举成员可以是哪些类型A✅ 数字字面量✅ 字符串字面量✅ 引用其他常量枚举成员✅ 带括号的简单表达式❌ 变量、函数调用等运行时值除非用const enum且表达式是编译期常量Q17如何比较枚举值AenumStatus{Ok1,Error2}consts:Status1;// 三种等价写法sStatus.Ok;// ✅ 推荐s1;// ✅ 数字枚举允许sasnumber1;// ✅ 显式转换Q18如何提取枚举的值类型AenumMyEnum{Aa,Bb}// 获取所有值的联合类型typeMyEnumValue${MyEnum};// a | b// 或typeMyEnumValue2typeofMyEnum[keyoftypeofMyEnum];// MyEnum.A | MyEnum.B总结对比表特性数字枚举字符串枚举const enum编译后体积较大双向映射较大无内联反向映射✅ 支持❌ 不支持❌ 不支持运行时访问✅ 可以✅ 可以❌ 不可以类型安全⚠️ 较松✅ 严格✅ 严格推荐场景位运算、需要反向映射API 参数、配置项纯类型、性能敏感