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

如何为TypeScript联合类型中的嵌套对象添加指定属性?

为联合类型中的嵌套对象添加属性

需求场景

之前已经实现了给联合类型中的对象直接添加属性的方案,现在需要扩展到嵌套对象的场景:

给定示例类型:

type A = {
    something: {a: 1, nestedA: {
      a: 1,
      // 需要添加 newProp: 1
    }} | {b: 1, nestedB: {
      b: 1
      // 需要添加 newProp: 1
    }} | {c: 1},
    somethingElse: 2
};

我们需要手动指定目标键(如nestedA或nestedB),给这些键对应的嵌套对象添加newProp: 1,最终得到如下类型:

type B = {
    something: {a: 1, nestedA: {
      a: 1,
      newProp: 1
    }} | {b: 1, nestedB: {
      b: 1,
      newProp: 1
    }} | {c: 1},
    somethingElse: 2
};

期望实现一个泛型助手类型SomeCrazyHelper<T, 'nestedA' | 'nestedB'>来完成这个操作。

解决思路

核心是利用TypeScript的分布式条件类型和类型交集来处理联合类型中的每个成员:

1. 定义嵌套属性添加工具

先写一个处理单个对象的泛型,检查对象是否包含指定键,若包含则给对应嵌套对象添加属性:

type AddNestedProp<Obj, Key extends string, Prop> = 
  Obj extends Record<Key, infer Nested> 
    ? Omit<Obj, Key> & { [K in Key]: Nested & Prop }
    : Obj;
  • 用Record<Key, infer Nested>推断出目标键对应的嵌套对象类型Nested
  • 通过Omit保留原对象其他属性,再和添加了新属性的嵌套对象做交集

2. 实现顶层泛型助手

遍历原类型的所有键,对每个键的类型(尤其是联合对象类型)应用上面的工具:

type SomeCrazyHelper<T, Keys extends string> = {
  [K in keyof T]: 
    T[K] extends object 
      ? T[K] extends infer U 
        ? U extends object 
          ? AddNestedProp<U, Keys, { newProp: 1 }>
          : U
        : T[K]
      : T[K]
};
  • 当T[K]是联合类型时,分布式条件类型会自动遍历联合中的每个成员,逐个应用AddNestedProp
  • 不包含目标键的成员(比如{c:1})会直接返回原类型,不会被修改

3. 使用示例

直接调用泛型即可得到目标类型:

type B = SomeCrazyHelper<A, 'nestedA' | 'nestedB'>;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 22:23:08