const Status = { Draft: 'draft', Paid: 'paid' } as const;
type Status = typeof Status[keyof typeof Status];
const s: Status = Status.Paid;
打包分析里看到一个只有六个状态的枚举,编译后变成一段自执行函数加双向映射对象,gzip 后还占 400 字节,摇树没有把它删掉。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,数字枚举会生成正反两套映射,产物是真实运行的代码而不是纯类型,没法被摇树。跨包引用时整段枚举都会被拉进包里,字符串常量配 as const 只留类型。
「enum 与 as const」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
处理上按这个顺序:先确认有没有用到反向映射 也就是拿值去取键;没有就改成 as const 对象 用 typeof 取联合类型;引用处改成对象成员访问 写法基本不变;对比改动前后产物体积 确认那段代码真的没了。
改完只确认一件事:产物里搜不到那段自执行函数 类型提示仍能列出三个值 体积少了那几百字节。
