使用Deep Partial为TypeScript嵌套对象赋值报错,求解决方案
解决嵌套DeepPartial对象的赋值问题
你遇到的核心问题是:DeepPartial只是在类型层面让所有层级的属性变为可选,但运行时你的userOne初始是空对象,address、legalAddress这些嵌套属性实际并不存在(值为undefined),直接访问深层属性自然会报错。
下面是几种可行的解决方法:
1. 分步初始化嵌套对象
手动逐层创建缺失的嵌套对象,再赋值深层属性:
let userOne: DeepPartial<User> = {}; userOne.firstName = "Ron"; // 先初始化address userOne.address = {}; // 再初始化legalAddress userOne.address.legalAddress = {}; // 现在可以安全赋值city userOne.address.legalAddress.city = "NY";
2. 先检查再创建缺失层级
通过条件判断确保每一层对象存在,不存在则初始化:
let userOne: DeepPartial<User> = {}; userOne.firstName = "Ron"; // 确保address存在 if (!userOne.address) { userOne.address = {}; } // 确保legalAddress存在 if (!userOne.address.legalAddress) { userOne.address.legalAddress = {}; } userOne.address.legalAddress.city = "NY";
3. 封装工具函数自动创建嵌套层级
写一个通用工具函数,自动处理深层路径的赋值,无需手动初始化每一层:
function setDeepNestedValue<T>(obj: DeepPartial<T>, path: string[], value: unknown): void { let current: any = obj; // 遍历路径的前n-1层,创建缺失的对象 for (let i = 0; i < path.length - 1; i++) { const key = path[i]; if (current[key] === undefined) { current[key] = {}; } current = current[key]; } // 赋值最后一层属性 current[path[path.length - 1]] = value; } // 使用示例 let userOne: DeepPartial<User> = {}; userOne.firstName = "Ron"; setDeepNestedValue(userOne, ["address", "legalAddress", "city"], "NY");
4. 使用展开运算符批量更新嵌套属性
通过对象展开运算符,保留原有属性的同时更新目标深层属性:
let userOne: DeepPartial<User> = {}; userOne.firstName = "Ron"; // 批量更新address及legalAddress的city属性 userOne.address = { ...userOne.address, // 保留address原有属性 legalAddress: { ...userOne.address?.legalAddress, // 保留legalAddress原有属性 city: "NY" } };
内容的提问来源于stack exchange,提问作者user3083590
相关产品推荐
相关产品推荐

