据我了解,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数字类型。
我在这里纠正吗?