Skip to content

值空间与类型空间:同名标识符为什么有时能共存

主题边界

  • TypeScript 在编译期区分值空间和值空间之外的类型空间,同名符号不一定冲突。
  • 理解这件事能解释大量 only refers to a typeisolatedModules 和 import 产物问题。

机制与流程

  • interface、type alias 只存在于类型空间,编译后会被擦除;变量、函数、对象字面量存在于值空间。
  • class 和 enum 同时引入值与类型,因此既能用于注解,也会产生运行时代码。
  • import type 只导入类型信息,不生成运行时依赖,有助于消除无用引用和循环依赖。

关键差异

  • 把类型 import 成普通 import 可能在某些编译链下留下无意义的运行时依赖。
  • namespace、enum、class 这些兼具值和类型的构造,在现代工程里使用要特别看产物代价。

边界条件

  • 只在 IDE 中看见类型可用,不代表运行时对象一定存在。
  • Babel、esbuild、tsc 对类型擦除和导入保留策略不同,配置变化会暴露空间混淆问题。

工程落点

  • 大型项目里要明确哪些符号只服务于类型系统,避免不必要的 bundle 污染和循环依赖。
  • 库设计中暴露类型与值的方式会直接影响使用者的导入写法与 tree-shaking 效果。

相关主题