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

TypeScript自动推断类型异常:对象合并后类型不符预期

TypeScript 对象合并后类型推断不符合预期

我想把List2中的所有对象逐个合并到List1的每个对象中,得到包含所有属性的对象数组,但TypeScript自动推断的返回类型和预期不一致。

代码示例

const List1 = [{ lll: 'Jiyik' },{ ppp: 'Jiyik' }];

const List2 = [{ country: 'China' },{ country2: 'China2' }];


const result = List1.map(data => {
    List2.forEach(data2 => {
        return Object.assign(data,data2)
    }) 
    return data
}) 

预期输出

[
  {
    "lll": "Jiyik",
    "country": "China",
    "country2": "China2"
  }, 
  {
    "ppp": "Jiyik",
    "country": "China",
    "country2": "China2"
  }
]

实际推断类型

const result: ({
    lll: string;
    ppp?: undefined;
} | {
    ppp: string;
    lll?: undefined;
})[]

问题原因

  1. forEach里的return对外层逻辑没有影响,虽然Object.assign确实会原地修改data对象,但TypeScript的类型系统不会跟踪循环内部的对象突变,所以依然认为返回的是List1元素的原始联合类型。
  2. 原地修改原数组元素的写法,本身就很难让类型推断跟上运行时的属性变化。

解决方法

方法1:创建新对象+明确类型(推荐)

不修改原数组元素,而是把List1的元素和List2所有对象合并成新对象,同时通过类型定义让TypeScript正确识别合并后的类型:

// 用as const锁定字面量类型,让类型推断更精准
const List1 = [{ lll: 'Jiyik' },{ ppp: 'Jiyik' }] as const;
const List2 = [{ country: 'China' },{ country2: 'China2' }] as const;

// 推导List2合并后的对象类型
type MergedList2 = typeof List2[number];
type CombinedList2 = MergedList2 extends object ? MergedList2 : never;

// 定义最终每个结果项的类型:List1元素类型 + List2合并后的类型
type ResultItem = typeof List1[number] & CombinedList2;

const result = List1.map(data => {
  // 合并成新对象,避免修改原数据
  return Object.assign({}, data, ...List2) as ResultItem;
});

此时result的类型会被正确推断为包含所有属性的联合对象数组,和运行时结果完全匹配。

方法2:简化写法+手动指定返回类型

如果不需要严格的字面量类型,也可以直接用扩展运算符合并,同时手动指定结果类型:

// 先定义基础类型
type List1Item = { lll: string } | { ppp: string };
type List2Combined = { country: string; country2: string };
type ResultItem = List1Item & List2Combined;

const List1: List1Item[] = [{ lll: 'Jiyik' },{ ppp: 'Jiyik' }];
const List2 = [{ country: 'China' },{ country2: 'China2' }];

const result: ResultItem[] = List1.map(data => {
  // 把List2合并成一个对象后再和data合并
  return { ...data, ...Object.assign({}, ...List2) };
});

这种写法更简洁,同样能让TypeScript识别到结果是包含所有属性的对象数组。


内容的提问来源于stack exchange,提问作者林秩宇治與

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 12:40:56