TypeScript不同结构对象映射问题:ObjectA转ObjectB遇阻
TypeScript 对象映射:ObjectA 转 ObjectB 解决方案
核心思路
针对嵌套对象的类型转换,核心是逐层遍历+属性筛选:顶层属性直接映射,嵌套数组用map遍历处理,子类型只保留目标结构需要的字段。
完整实现代码
首先补充原代码中遗漏的Address和PhoneNumber类型定义,再实现转换逻辑(注意不能直接用ObjectA类型赋值,需传入具体实例):
interface Address { street: string; // 可按需添加其他地址字段 } interface PhoneNumber { number: string; // 可按需添加其他号码字段 } interface PassengerV1 { firstName: string; lastName: string; address: Address; temp1: string; temp2: string; phoneNumbers: PhoneNumber[]; } interface PassengerV2 { firstName: string; lastName: string; address: Address; } interface ObjectA{ lossCause: string; lossDate: string; vehicleInformation: { vehicle: [ { passengerInformation: { passenger: PassengerV1[];}; } ]; }; } interface ObjectB{ lCause: string; lDate: string; vehicleInfo: { vehicle: [ { passengerInformation: { passenger: PassengerV2[]; }; ]; }; } // 定义转换函数 function convertObjectAToObjectB(objA: ObjectA): ObjectB { return { lCause: objA.lossCause, lDate: objA.lossDate, vehicleInfo: { vehicle: objA.vehicleInformation.vehicle.map(vehicleItem => ({ passengerInformation: { // 方式1:显式提取需要的属性,可读性强 passenger: vehicleItem.passengerInformation.passenger.map(passenger => ({ firstName: passenger.firstName, lastName: passenger.lastName, address: passenger.address })) // 方式2:解构丢弃多余属性,代码更简洁 // passenger: vehicleItem.passengerInformation.passenger.map(({ temp1, temp2, phoneNumbers, ...passengerV2 }) => passengerV2) } })) } }; } // 使用示例:传入具体的ObjectA实例 const objA: ObjectA = { lossCause: "车辆碰撞", lossDate: "2024-05-20", vehicleInformation: { vehicle: [ { passengerInformation: { passenger: [ { firstName: "张", lastName: "三", address: { street: "XX路123号" }, temp1: "临时字段1", temp2: "临时字段2", phoneNumbers: [{ number: "138xxxx1234" }] } ] } } ] } }; const requestData: ObjectB = convertObjectAToObjectB(objA);
关键细节说明
- 数组处理:嵌套的
vehicle和passenger数组都用map遍历,确保每个元素都完成类型转换。 - 属性筛选:
- 显式提取属性:适合目标字段较少的场景,可读性强,TypeScript会自动校验类型匹配。
- 解构丢弃多余属性:利用ES6解构语法快速剥离不需要的字段,剩余字段自动匹配
PassengerV2类型。
- 可维护性优化:如果后续乘客转换逻辑复杂,可抽成单独函数:
然后在function convertPassengerV1ToV2(passenger: PassengerV1): PassengerV2 { const { temp1, temp2, phoneNumbers, ...rest } = passenger; return rest; }map中调用:passenger: vehicleItem.passengerInformation.passenger.map(convertPassengerV1ToV2)
内容的提问来源于stack exchange,提问作者RC20
相关产品推荐
相关产品推荐

