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
相关产品推荐
相关产品推荐

