Appearance
值空间与类型空间:同名标识符为什么有时能共存
主题边界
- TypeScript 在编译期区分值空间和值空间之外的类型空间,同名符号不一定冲突。
- 理解这件事能解释大量
only refers to a type、isolatedModules和 import 产物问题。
机制与流程
- interface、type alias 只存在于类型空间,编译后会被擦除;变量、函数、对象字面量存在于值空间。
- class 和 enum 同时引入值与类型,因此既能用于注解,也会产生运行时代码。
import type只导入类型信息,不生成运行时依赖,有助于消除无用引用和循环依赖。
关键差异
- 把类型 import 成普通 import 可能在某些编译链下留下无意义的运行时依赖。
- namespace、enum、class 这些兼具值和类型的构造,在现代工程里使用要特别看产物代价。
边界条件
- 只在 IDE 中看见类型可用,不代表运行时对象一定存在。
- Babel、esbuild、tsc 对类型擦除和导入保留策略不同,配置变化会暴露空间混淆问题。
工程落点
- 大型项目里要明确哪些符号只服务于类型系统,避免不必要的 bundle 污染和循环依赖。
- 库设计中暴露类型与值的方式会直接影响使用者的导入写法与 tree-shaking 效果。