如何映射嵌套对象值并保留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
相关产品推荐
相关产品推荐

