使用 Object.assign() 时如何忽略只有 getter 的属性?

How to ignore properties with only a getter when using Object.assign()?

我有一个未定义类型的对象源,但表示一个类型化对象。所以我正在使用 Object.assign(target, source)。但是我的 class 具有 getter 的属性(因为它们是其他属性的计算结果)。

一个例子:

source: {
  a: 1,
  b: 2,
  sum: 3
}

class SomeClass {
  a: number;
  b: number;

  get sum(): number {
    return a + b;
  }
}

someFunction() {
  let obj = new SomeClass();
  Object.assign(obj, source);
}

在上述情况下,我得到一个错误: 无法设置 [object Object] 的 属性 总和,它只有 getter

Object.assign() 是否可以忽略源对象中的那些属性?

你不能为此使用 Object.assign()because

The Object.assign() method is used to copy the values of all enumerable own properties from one or more source objects to a target object.

换句话说,Object.assign()source 的可枚举属性驱动,不受目标中属性定义方式的影响。

您必须实现自己的函数,而不是 Object.assign(),这将跳过目标不可写的属性,或者找到一些执行此操作的库。

对此的一个 hacky 解决方案是只有一个空 setter:

get sum(): number {
    return a + b;
}

set sum(value) {}