You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 18:12:21