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

TypeScript 4.9及以上版本如何实现深层类型交叉?

解决TypeScript 4.9+中嵌套交叉类型的兼容问题

TypeScript 4.9及以上版本对交叉类型的合并逻辑做了调整,深层嵌套的交叉类型不再自动合并,导致你原来的写法失效。针对这个需求,有两种可行的解决方式:

1. 手动合并类型(简单场景首选)

直接写出交叉后最终的类型结构,避免依赖TypeScript自动合并嵌套交叉:

type G = {
  props: {
    a: {
      foo: 1;
      bar: 2;
      qux: 3;
    };
  };
};

const g: G = {
  props: {
    a: { foo: 1, bar: 2, qux: 3 }
  }
};

2. 使用工具类型自动合并(复杂场景适用)

如果需要动态合并多个嵌套类型,可以自定义一个DeepMerge工具类型,递归处理深层属性的交叉合并:

type DeepMerge<T, U> = 
  T extends object 
    ? U extends object
      ? {
          [K in keyof T | keyof U]: 
            K extends keyof T 
              ? K extends keyof U 
                ? DeepMerge<T[K], U[K]> 
                : T[K]
              : K extends keyof U 
                ? U[K] 
                : never;
        }
      : U
    : U;

// 用DeepMerge合并目标类型
type G = DeepMerge<
  { props: { a: { foo: 1 }} & { a: { bar: 2 }} },
  { props: { a: { qux: 3 }} }
>;

const g: G = {
  props: {
    a: { foo: 1, bar: 2, qux: 3 }
  }
};

这个DeepMerge类型会递归遍历对象的每个属性:若两个属性均为对象则继续深层合并,若仅一方存在该属性则直接保留对应类型,还原旧版本TypeScript的交叉合并行为。如果需要处理数组、可选属性等复杂场景,可以进一步扩展这个工具类型的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 09:15:34