在角度服务中公开只读信号数组的最佳方法

问题描述 投票:0回答:1

我在服务中使用 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
,我觉得这意味着消费者不应该尝试改变底层数组(即使它不强制执行此规则)。

所以我的问题是: 这里的最佳实践是什么?我应该将其标记为只读并相信消费者不会改变底层数组,还是应该公开一个深层副本,这样即使性能损失很小并且代码可读性稍差,也绝对没有风险?

angular signals
1个回答
0
投票

第一种方法是正确的:

myObjects = this._myObjects.asReadonly();

它避免了像

set
update
这样的信号设置方法,这些是写入信号的唯一有效方法。

除此之外,所有其他改变信号内部值的方法,都应该在 PR 的代码审查和开发人员代码的一般检查中进行,没有内置的方法可以阻止这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.