Skip to content

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

主题定位

TypeScript 同时维护值空间和类型空间,很多 import、enum、class 问题都来自两者混淆。

  • TypeScript 同时维护值空间和类型空间,很多 import、enum、class 问题都来自两者混淆
  • TypeScript 在编译期区分值空间和值空间之外的类型空间,同名符号不一定冲突
  • 理解这件事能解释大量 only refers to a type、isolatedModules 和 import 产物问题
  • 只在 IDE 中看见类型可用,不代表运行时对象一定存在

关键概念拆分

对象一

对象一 先看职责边界,再看生命周期、数据形态和与其他对象的协作关系。 对象一 的差异最终会体现在 类型表达、缩窄推导、工程约束 这几个维度。 对象一 讲清适用边界、失效条件和代价结构,结论才有技术含量。

对象二

对象二 先看职责边界,再看生命周期、数据形态和与其他对象的协作关系。 对象二 的差异最终会体现在 类型表达、缩窄推导、工程约束 这几个维度。 对象二 讲清适用边界、失效条件和代价结构,结论才有技术含量。

差异对照与适用场景

  • TypeScript 同时维护值空间和类型空间,很多 import、enum、class 问题都来自两者混淆
  • TypeScript 在编译期区分值空间和值空间之外的类型空间,同名符号不一定冲突
  • 理解这件事能解释大量 only refers to a type、isolatedModules 和 import 产物问题
  • 只在 IDE 中看见类型可用,不代表运行时对象一定存在
  • interface、type alias 只存在于类型空间,编译后会被擦除;变量、函数、对象字面量存在于值空间
  • class 和 enum 同时引入值与类型,因此既能用于注解,也会产生运行时代码

工程建议与边界

  • TypeScript 同时维护值空间和类型空间,很多 import、enum、class 问题都来自两者混淆
  • TypeScript 在编译期区分值空间和值空间之外的类型空间,同名符号不一定冲突
  • 理解这件事能解释大量 only refers to a type、isolatedModules 和 import 产物问题
  • 只在 IDE 中看见类型可用,不代表运行时对象一定存在
  • interface、type alias 只存在于类型空间,编译后会被擦除;变量、函数、对象字面量存在于值空间

问答设计及延伸

标准回答

回答 值空间与类型空间:同名标识符为什么有时能共存 时,先定义 对象一、对象二 各自解决的问题,再比较它们在 类型表达、缩窄推导、工程约束 上的差异,最后给出选型边界和工程代价。

追问拆解

  • 值空间与类型空间:同名标识符为什么有时能共存 与“Vite 构建链路:开发服务器、预构建与生产产物”的边界关系
  • 值空间与类型空间:同名标识符为什么有时能共存 与“Babel 与 TypeScript 转译:语法降级、类型擦除与职责边界”的边界关系
  • 跨标签页、跨域、多端协作场景下的结论变化
  • 维护成本上升后的优先级调整

容易失分的点

  • 只给“哪个好”的结论,不先拆对象
  • 只报 API 或术语,不解释运行时行为和代价
  • 缺少真实场景,导致结论过度绝对

项目映射

  • 结合真实系统说明 对象一 到 对象二 分别落在哪段链路
  • 补充未选方案的放弃原因和约束差异
  • 补充线上问题、治理动作和验证结果

相关主题