如何实现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 }创建原对象的浅拷贝,避免直接修改输入的原始对象 - 属性处理逻辑:遍历默认对象的每个属性,仅在两种情况下应用默认值:
- 原对象中该属性的值为
null - 原对象中不存在该属性(对应可选属性未定义的场景)
- 原对象中该属性的值为
- 类型断言:确保类型转换符合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,提问作者无夜之星辰
相关产品推荐
相关产品推荐

