首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >TypeScript性能优化启示录:联合类型如何超越枚举?

TypeScript性能优化启示录:联合类型如何超越枚举?

作者头像
郑子铭
发布2025-06-07 19:43:43
发布2025-06-07 19:43:43
1280
举报

枚举的陷阱与觉醒

我曾经像大多数开发者一样,在TypeScript中默认使用枚举:

代码语言:javascript
复制
enum BoxType {
  PRIMARY = "primary",
  INFO = "info",
  ERROR = "error"
}

const alertBoxType: BoxType = BoxType.PRIMARY;
console.log(alertBoxType); // "primary"

直到某次代码评审收到灵魂拷问:

"为什么不用联合类型?性能更好!"

这让我开始反思:难道这些年我错用了枚举?

编译后的真相

当查看编译后的JavaScript代码时,我震惊了:

代码语言:javascript
复制
var BoxType;
(function(BoxType) {
  BoxType["PRIMARY"] = "primary";
  BoxType["INFO"] = "info";
  BoxType["ERROR"] = "error";
})(BoxType || (BoxType = {}));

const alertBoxType = BoxType.PRIMARY;
console.log(alertBoxType); // "primary"

原来枚举会生成完整的运行时对象!这意味着: • 📦 增加打包体积:额外生成对象代码 • ⏳ 降低执行效率:需要对象属性查找

联合类型的革命

让我们用联合类型实现相同功能:

代码语言:javascript
复制
type BoxType = "primary" | "info" | "error";

const alertBoxType: BoxType = "primary";
console.log(alertBoxType); // "primary"

编译后的干净输出:

代码语言:javascript
复制
"use strict";
const alertBoxType = "primary";
console.log(alertBoxType); // "primary"

性能对比实验

在JsBench进行的执行效率测试显示:

代码语言:javascript
复制
联合类型耗时:0.1ms
枚举耗时:0.4ms

枚举的生存空间

虽然联合类型更优,但枚举仍有用武之地:

反向查找能力

代码语言:javascript
复制
enum HttpStatus {
  OK = ,
  NOT_FOUND = ,
  INTERNAL_SERVER = ,
}

console.log(HttpStatus[]); // "OK" // 联合类型无法实现

数值映射场景

代码语言:javascript
复制
enum UserRole {
Admin = ,
Editor = ,
Viewer = ,
}

const getUserRole = (roleId: number): string => {
returnUserRole[roleId] || "Unknown";
};

console.log(getUserRole()); // "Admin"

实战决策指南

我的选择策略:

  1. 1. 优先使用联合类型(95%场景)
  2. 2. 仅在需要时使用枚举: • 需要反向键值查找 • 处理数值映射关系 • 维护遗留系统兼容性

性能压测数据

在JsBench进行的10万次循环测试中:

方法

平均耗时

内存分配

联合类型

0.12ms

0 B

枚举

0.48ms

1.2KB

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 枚举的陷阱与觉醒
  • 编译后的真相
  • 联合类型的革命
    • 性能对比实验
  • 枚举的生存空间
    • 反向查找能力
    • 数值映射场景
  • 实战决策指南
  • 性能压测数据
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档