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

如何映射嵌套对象值并保留Wrapper泛型类型信息?

解决嵌套对象到Wrapper类型的映射问题

首先定义基础类型:

// 原始值包装类型
type ValueObject<T> = { value: T };
// 目标包装类型
type Wrapper<T> = { wrapped: T };

递归映射类型实现

通过递归的映射类型,同时处理ValueObject包装值和嵌套对象:

type MapToWrapped<T> = {
  [K in keyof T]: 
    // 若属性是ValueObject,直接提取内部类型作为Wrapper的泛型参数
    T[K] extends ValueObject<infer V> 
      ? Wrapper<V> 
      : // 若属性是对象(非原始值),递归处理嵌套结构
        T[K] extends object 
          ? MapToWrapped<T[K]> 
          : // 原始值直接包装为Wrapper
            Wrapper<T[K]>;
};

类型验证示例

定义原始对象类型:

type OriginalObj = {
  a: ValueObject<number>;
  b: {
    c: ValueObject<string>;
    d: boolean;
  };
};

生成的目标类型MapToWrapped<OriginalObj>等价于:

type WrappedObj = {
  a: Wrapper<number>;
  b: {
    c: Wrapper<string>;
    d: Wrapper<boolean>;
  };
};

实际使用示例:

const original: OriginalObj = {
  a: { value: 42 },
  b: {
    c: { value: "hello" },
    d: true
  }
};

const wrappedValuesObj: WrappedObj = {
  a: { wrapped: 42 }, // 类型为Wrapper<number>,符合需求
  b: {
    c: { wrapped: "hello" },
    d: { wrapped: true }
  }
};

问题解决说明

  • 嵌套对象处理:通过判断属性是否为object,递归应用MapToWrapped类型,实现深层嵌套结构的转换。
  • 直接映射到Wrapper:利用条件类型的类型推断(infer V),从ValueObject<V>中提取原始类型V,直接生成Wrapper<V>,避免了嵌套的Wrapper<ValueObject<...>>结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:30:05