引用类型在复杂数据模型中“存连接”而非“存值”,通过地址指向或逻辑关联实现可追溯、可复用、可解耦的结构关系;它支持按语义层级组织接口与对象,用 interface 描述数据形状、class 封装行为,结合 map/数组等集合类型构建动态结构,并通过 readonly 或不可变约定提升可预测性。

引用类型在复杂数据模型中不是“存值”,而是“存连接”——它让不同数据块之间形成可追溯、可复用、可解耦的结构关系。这种组织方式不依赖数据重复,而靠地址指向或逻辑关联来维持一致性。
按语义层级组织接口与对象
在 TypeScript 或 HarmonyOS 等现代前端/应用开发中,常使用 interface 定义纯数据形状(如 StationData),再用数组或 Map 组织多个实例。这种方式把“结构契约”和“运行时数据”分开:接口描述字段名、类型、是否可选;实际数据用字面量或 API 响应填充。好处是零运行时开销、易校验、便于类型推导。
- 接口只声明“长什么样”,不参与实例化,适合静态配置或 DTO(数据传输对象)
- 当需要行为(如计算地址字符串、格式化坐标)时,才升级为 class,加入方法和状态管理
- 多个 interface 可通过嵌套或联合类型组合,例如一个加油站 StationData 包含 Owner(另一个 interface)字段,实现轻量级关联
用引用关系替代数据冗余
在数据库或本地状态管理中,引用类型支撑“一对多”“多对一”等关系建模。比如订单表不存用户全名和电话,只存 userId 字符串;查询时通过该 id 去用户表查详情。这本质上是用字符串或数字作为引用标识,而非复制整条用户记录。
- 外键(如 SQL 中的 user_id)是典型引用,保证关联存在性,也支持级联更新或删除
- 前端状态中常用 Map 或 Record
缓存实体,用 ID 当 key,其他地方只存 ID —— 减少内存占用,一处更新处处同步 - 避免深拷贝:修改某个 StationData 实例的 name,所有持有该引用的地方都会看到变化(前提是没做 immutable 处理)
结合集合类型构建动态结构
数组、Map、Set 这些本身就是引用类型,天然适合组织变动频繁、数量不确定的复杂数据。例如加油站列表 STATION_LIST 是 StationData[] 类型,它本身是个引用,指向堆中一段连续或链式存储的空间。
- 数组适合顺序访问和索引查找,但插入/删除中间项成本高;适合展示列表、轮播图等线性结构
- Map 用键值对组织,查找 O(1),适合按 ID 快速取对象,也方便做缓存或映射转换
- 嵌套引用更常见:StationData 中的 image 字段可能是 ResourceStr(字符串路径或资源引用),它不存图片二进制,只存“怎么找到它”的线索
配合不可变约定提升可预测性
虽然引用类型默认可变,但在复杂模型中常主动约束其行为。例如用 readonly 修饰 interface 字段,或用 immer、Immer.js 在修改时生成新引用,避免意外副作用。
- 定义 interface 时加 readonly,防止误赋值(如 readonly id: string)
- 状态更新时不直接 push 或 splice 数组,而是用 [...oldList, newItem] 创建新引用
- 后端返回的 JSON 数据自动转为引用对象,前端不 deepClone 就直接用 —— 省资源,但需注意谁在改它











