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

如何实现assignDefaults函数为对象null值设置默认值?

实现替换对象null值为指定默认值的assignDefaults函数

需求很明确:我们需要一个函数,能把目标对象中值为null的属性替换成指定的默认值,同时保留原对象中非null的属性;对于原对象未定义的可选属性,直接使用默认值补全。

实现方案(TypeScript版本)

这里给出兼顾类型安全和功能的实现:

function assignDefaults<T extends object, U extends Partial<T>>(obj: T, defaults: U): T & U {
  // 复制原对象,避免修改输入的原始数据
  const result = { ...obj };

  // 遍历默认对象的所有属性
  for (const key in defaults) {
    if (Object.prototype.hasOwnProperty.call(defaults, key)) {
      // 仅当原对象该属性为null,或原对象不存在该属性时,应用默认值
      if (result[key] === null || !(key in result)) {
        result[key as keyof T] = defaults[key] as T[keyof T];
      }
    }
  }

  return result as T & U;
}

代码说明

  • 泛型定义:T对应原对象的类型,U限制默认值对象只能包含T的属性(可选或必填),保证类型安全
  • 原对象保护:通过扩展运算符{ ...obj }创建原对象的浅拷贝,避免直接修改输入的原始对象
  • 属性处理逻辑:遍历默认对象的每个属性,仅在两种情况下应用默认值:
    1. 原对象中该属性的值为null
    2. 原对象中不存在该属性(对应可选属性未定义的场景)
  • 类型断言:确保类型转换符合TypeScript的类型检查规则

验证示例

用你提供的测试代码验证,输出完全符合预期:

interface MyObject {
  id: number;
  name: string | null;
  age?: number | null;
  address?: string | null;
}

const myObj: MyObject = { id: 1, name: null, age: 30 };

const newMyObj = assignDefaults(myObj, {
  name: 'Default Name',
  address: 'New York',
});

console.log(newMyObj); 
// 输出:{ id: 1, name: 'Default Name', age: 30, address: 'New York' }

额外说明

  • 该函数是浅拷贝实现,如果对象包含嵌套属性,需要额外处理嵌套对象的null值(可递归扩展逻辑)
  • 只处理默认对象中明确指定的属性,原对象其他未涉及的属性会完整保留

内容的提问来源于stack exchange,提问作者无夜之星辰

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:55:16