namespace、ES Module、enum 与字面量联合怎么选择?
先理解原理和示例,再练习完整口述与追问。
回答要点
组织代码与组织类型;模块化优先适配工具链;enum 可能产运行时代码;联合通常被擦除;const enum 兼容边界。
原理拆解
ES Module 用 import/export 组织依赖和作用域,是常见应用与库的模块基础。namespace 是 TS 提供的另一种组织方式,在特定历史或声明场景仍可见,不需要给每个模块再套一层。普通 enum 通常会生成运行时对象;字面量联合只约束类型,不提供运行时列表。需要列表时可用 as const 对象或数组再推导类型。
示例与推演
const Status = { Ready: 'ready', Done: 'done' } as const
type StatusValue = typeof Status[keyof typeof Status]
function setStatus(value: StatusValue) { return value }
setStatus('ready')
既有运行时可用常量,也保留字面量类型,不必为了两个固定值引入复杂 namespace。
易错点
moduleDetection 等配置影响文件是否被识别为模块,不能永远断言“无 import/export 必是全局”。const enum 在独立转译和库发布中有额外限制。
参考回答可直接练习口述
我优先用标准模块组织依赖,按是否需要运行时对象选择 enum 或常量加字面量联合。类型与值要分清,namespace 和 const enum 只在明确场景与构建支持下使用。