在依赖项注入中使用只读

时间:2020-03-23 23:08:12

标签: angular typescript nestjs

我想知道在向构造函数中注入某些东西时是否需要设置只读? 例如:

constructor(readonly private userService: UserService) { }

您能解释一下这种做法的有用性吗?

2 个答案:

答案 0 :(得分:1)

readonly并不会使其变为只读,这只是意味着Typescript不会让任何人对其进行外部更改,私有应该完成我认为私有服务的同一件事:服务是最好的方式或使用公共服务:服务来使用它在html模板中

答案 1 :(得分:1)

简短:通常,由于您处理注入的服务,并且类型安全性可防止您分配新值,因此DI中不需要只读。

详细信息: 首先,如果要使用私有和只读,则为

private readonly userService: UserService

因此,只读在私有之后。

然后请注意public / private / protected和readonly之间的区别。

公共/私人/受保护的可见性有关。

  • public:任何人都可以看到此变量
  • private:变量仅在定义此变量的类内部可见
  • 受保护:仅在内部类和派生类中可见(A扩展了B)
另一方面,

只读是关于是否要某人无法更改

简单的例子:

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) {}

那么实际上并不是要注入的服务,我想知道这是否真的有效。但是让我们假设它确实..或由于任何原因,编译器未找到错误,然后在类内部我们可以为其分配一个新值。这很可能不是您真正想要的。不好。

如果您使用公共可见性,那么更危险的是,当然,会有更多的地方可以更改此变量-因此,更难识别问题的根源。