我在服务中使用 Angular 信号
@Injectable()
export class MyService {
private _myObjects = signal<MyObject[]>([]);
}
我想以只读方式将该数组公开给组件。我看到两种方法:
myObjects = this._myObjects.asReadonly();
和
myObjects = computed(() => myDeepCopy(this._myObjects()));
// where myDeepCopy is whatever deep copy function you can imagine
第一种方法实际上并不能防止组件中底层数组的突变,但它速度更快,因为我不需要每次
_myObjects
更改时创建新的深层副本。
此外,因为它被标记为readOnly
,我觉得这意味着消费者不应该尝试改变底层数组(即使它不强制执行此规则)。
所以我的问题是: 这里的最佳实践是什么?我应该将其标记为只读并相信消费者不会改变底层数组,还是应该公开一个深层副本,这样即使性能损失很小并且代码可读性稍差,也绝对没有风险?
第一种方法是正确的:
myObjects = this._myObjects.asReadonly();
它避免了像
set
和update
这样的信号设置方法,这些是写入信号的唯一有效方法。
除此之外,所有其他改变信号内部值的方法,都应该在 PR 的代码审查和开发人员代码的一般检查中进行,没有内置的方法可以阻止这种情况。