You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中枚举使用export和export type导出有什么区别?

二者核心差异非常明确,和TS的枚举特性直接相关:

首先你要明确一个基础前提:TS的枚举不是纯类型,它会被编译为真实存在的JS运行时对象,和接口、类型别名这类仅编译期存在的纯类型有本质区别。

  • 用普通export导出枚举:会同时导出枚举的类型声明+运行时实体,下游使用时不管是做类型标注(比如const status: ConfigurationStatus),还是读取枚举成员的运行时值(比如if (status === ConfigurationStatus.Complete))都完全合法,构建工具的Tree Shaking也能正常清理未被使用的枚举。
  • 用export type导出枚举:只会导出枚举的类型部分,完全丢弃运行时相关的导出信息。下游如果尝试读取枚举成员的值,TS会直接抛出「不能将类型用作值」的错误,只有仅把枚举当做类型标注使用的场景下才不会报错。

选择建议

绝大多数场景下都优先选普通export导出枚举:毕竟大部分时候我们定义枚举就是为了用它的运行时成员值做逻辑判断、赋值,用export type会直接导致正常的运行时调用报错。
只有你100%确认下游所有引用这个枚举的地方都只会做类型标注、永远不会读取它的运行时值的极端场景下,才需要选export type。

另外补充下你提到的接口强制用export type的原因:接口是纯编译期类型,没有对应的运行时实体,在TS的isolatedModules模式(大部分TS项目默认开启)下要求纯类型必须用export type导出,避免编译后导出不存在的运行时值引发错误,这条规则本来就不适用于有运行时实体的枚举。


内容的提问来源于stack exchange,提问作者Bibipkins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:27:02