You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript使用扩展运算符合并多个Map为何得到空对象?

Map合并问题的解答

1. 为何代码不抛出编译时错误?

  • TypeScript采用结构类型系统(鸭子类型),默认配置下不会严格校验对象是否完全实现目标类型的所有方法/属性。Map本质是特殊对象,通过{...m1}得到的空对象属于object类型,TypeScript认为二者在结构上存在兼容(仅检查类型归属,不验证具体方法存在性),因此不会报错。
  • 若开启strict模式(包含strictFunctionTypes、strictNullChecks等严格校验选项),TypeScript会检测到空对象缺少Map的核心方法(如get、set),此时会抛出类型不兼容错误。

2. 这种合并方式为何无效?

  • Map的键值对并非存储在对象的自有可枚举属性中,而是存在于内部的[[MapData]]私有槽位里。对象扩展运算符...仅会遍历并复制对象的自有可枚举属性,无法读取Map内部存储的键值对,因此扩展Map实例后得到的是空对象。
  • 正确合并Map的方式是利用Map的可迭代特性,直接将多个Map的键值对迭代器传入新Map构造函数:
const result = new Map<string, PolicyDocument>([...m1, ...m2, ...m3]);

内容的提问来源于stack exchange,提问作者PhalanX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 07:46:19