You need to enable JavaScript to run this app. TypeScript如何实现嵌套对象泛型类型的结构拷贝并保持类型安全
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript如何实现嵌套对象泛型类型的结构拷贝并保持类型安全

TypeScript 嵌套对象类型结构转换实现方案

核心递归工具类型定义

通过递归类型实现嵌套结构的遍历转换,仅对普通对象做深层遍历,其余类型直接映射为对应处理函数:

// 基础类型与对应处理函数的映射,可根据业务需求扩展
type TypeMethodMap = {
  string: (val: string) => void;
  number: (val: number) => void;
  boolean: (val: boolean) => void;
  Date: (val: Date) => void;
};

// 递归转换类型工具
type MapToMethod<T> = 
  // 匹配基础类型,返回对应处理函数
  T extends string ? TypeMethodMap['string'] :
  T extends number ? TypeMethodMap['number'] :
  T extends boolean ? TypeMethodMap['boolean'] :
  T extends Date ? TypeMethodMap['Date'] :
  // 匹配数组/元组,递归处理每个元素
  T extends Array<infer _> ? { [K in keyof T]: MapToMethod<T[K]> } :
  // 匹配普通对象,递归处理每个属性
  T extends Record<string, any> ? { [K in keyof T]: MapToMethod<T[K]> } :
  // 其余未匹配类型可根据需求调整返回值
  never;

运行时代码实现

按照要求仅遍历普通JS对象,实现逻辑如下:

// 题目给出的普通对象判断工具
const getClass: (object: any) => string = Function.prototype.call.bind(Object.prototype.toString);
const isVanillaObject = (obj: any) => {
    return getClass(obj) === "[object Object]";
};

// 基础类型处理函数生成逻辑,可根据业务需求自定义实现
const createTypeMethod = <T>(_: T): ((val: T) => void) => {
  return (val) => console.log("处理值:", val);
};

// 转换主函数
export function transformNestedStructure<T extends object>(input: T): MapToMethod<T> {
  // 处理数组/元组
  if (Array.isArray(input)) {
    return input.map(item => transformNestedStructure(item as any)) as any;
  }
  // 处理普通对象,递归遍历属性
  if (isVanillaObject(input)) {
    const result: Record<string, any> = {};
    for (const key of Object.keys(input)) {
      result[key] = transformNestedStructure(input[key] as any);
    }
    return result as any;
  }
  // 其余类型直接返回对应处理函数
  return createTypeMethod(input) as any;
}

使用示例

// 测试输入类型
interface NestedInput {
  name: string;
  arr: [
    string,
    Date,
    {a: boolean}
  ];
  nestedObject: {
    x: number;
    y: number;
  };
}

// 构造测试输入
const testInput: NestedInput = {
  name: "测试",
  arr: ["字符串", new Date(), {a: true}],
  nestedObject: {x: 10, y: 20}
};

// 得到转换后的结果
const output = transformNestedStructure(testInput);

// 嵌套属性访问完全支持类型提示,调用参数类型校验正常
output.name("传入字符串");
output.arr[1](new Date());
output.arr[2].a(false);
output.nestedObject.x(123);

扩展说明

如果需要新增其他不需要遍历的内置类型(如RegExp、Map、Set等),只需在TypeMethodMap中新增对应类型的处理函数映射,同时在createTypeMethod中补充对应生成逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 01:54:03