我想知道在向构造函数中注入某些东西时是否需要设置只读? 例如:
constructor(readonly private userService: UserService) { }
您能解释一下这种做法的有用性吗?
答案 0 :(得分:1)
readonly并不会使其变为只读,这只是意味着Typescript不会让任何人对其进行外部更改,私有应该完成我认为私有服务的同一件事:服务是最好的方式或使用公共服务:服务来使用它在html模板中
答案 1 :(得分:1)
简短:通常,由于您处理注入的服务,并且类型安全性可防止您分配新值,因此DI中不需要只读。
详细信息: 首先,如果要使用私有和只读,则为
private readonly userService: UserService
因此,只读在私有之后。
然后请注意public / private / protected和readonly之间的区别。
公共/私人/受保护的与可见性有关。
只读是关于是否要某人无法更改。
简单的例子:
private amountOfPizzas = 1;
private readonly stomachSize = 2;
public eat(numberOfPizzas: number): void {
if(this.stomachSize < numberOfPizzas) {
this.stomachSize = numberOfPizzas; // will throw an error
}
this.amountOfPizzas = numberOfPizzas; // works
eat(); // ..
}
这也适用于100%的依赖项注入。
当您以 private userService:UserService 的方式注入服务时,可以更改此变量。但是,由于Typescript的原因,只能为它分配一个新的UserService实例,因此,无论是否设置为只读,它实际上并没有太大的区别。
但是,假设您要注入另一个令牌,例如:
constructor(private numberOfPizzas: number) {}
那么实际上并不是要注入的服务,我想知道这是否真的有效。但是让我们假设它确实..或由于任何原因,编译器未找到错误,然后在类内部我们可以为其分配一个新值。这很可能不是您真正想要的。不好。
如果您使用公共可见性,那么更危险的是,当然,会有更多的地方可以更改此变量-因此,更难识别问题的根源。