更改数字字段时,ngrx-store-freeze不会抛出错误

时间:2018-02-25 13:44:54

标签: angular ngrx

据我了解,ngrx-store-freeze的目的是防止您意外更改现有状态而不是创建新对象。从他们的网站:

  

ngrx-store-freeze是一种防止状态变异的元缩减器

     

递归冻结当前状态,调度的动作有效负载(如果提供)和新状态。   当发生突变时,将抛出异常。   应该只在开发中使用,以确保状态保持不变。

但它似乎并不适用于number之类的原始类型。

function Reducer(counter : number = 0, action : Action) {
  counter++; // Should trigger an error but it doesn't.
  return counter + 1;
}

另一方面,如果我更改Reducer拍摄的对象内的字段,则可以:

function NestedReducer(nestedCounter : { counter : number } = { counter : 0 }, action : Action) {
  nestedCounter = { counter : 0 }; // Doesn't trigger an error.
  nestedCounter.counter++; // This does trigger an error.
  return { counter : nestedCounter.counter + 1 };
}

这是预期的行为吗?我认为它的工作方式类似于C#,因为原始类型是按值复制的,对象本身是按值复制的,但它们的值是"值"实际上是指向对象的指针。

所以我认为它与此有关:

let a = { counter : 0 };
let b = a;
console.log(`${a.counter}, ${b.counter}`);
b.counter++; // This changes a.counter as well since both a and b reference the same object.
console.log(`${a.counter}, ${b.counter}`);
b = { counter : 0 }; // This does not change a or a.counter, now a and b point to different objects.
console.log(`${a.counter}, ${b.counter}`);

这将打印出来:

0, 0
1, 1
1, 0

因此,ngrx-store-freeze只会阻止您更改输入参数中的属性(如果它是复合对象),而不是来自重新分配变量以引用其他对象,或者如果它是“#”,则不会更改它。 sa数字类型。

我在这里纠正吗?

0 个答案:

没有答案