在依赖注入中使用只读

Tim*_*IDE 0 typescript angular nestjs

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

constructor(readonly private userService: UserService) { }
Run Code Online (Sandbox Code Playgroud)

您能解释一下这种做法的用处(或没有用处)吗?

hog*_*gan 5

简而言之:通常您不需要在 DI 中只读,因为您处理注入的服务,并且类型安全可以保护您免于分配新值。

详细信息: 首先,如果你想使用private和readonly,那就是

private readonly userService: UserService
Run Code Online (Sandbox Code Playgroud)

所以 readonly 位于 private 之后。

然后注意公共/私有/受保护和只读之间的区别。

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

  • public:任何人都可以看到这个变量
  • private:变量仅在定义它的类内部可见
  • protected:仅在类内部和派生类中可见(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(); // ..
}
Run Code Online (Sandbox Code Playgroud)

这也适用于 100% 依赖注入。

当你以私有 userService: UserService的方式注入一个Service时,那么这个变量是可以改变的。然而,由于 Typescript 它只能被分配一个新的 UserService 实例,所以如果你设置只读或不设置它并没有太大的区别。

但是,假设您将注入另一个令牌,例如:

constructor(private numberOfPizzas: number) {}
Run Code Online (Sandbox Code Playgroud)

那么它并不是真正被注入的服务,我想知道这是否真的有效。但我们假设它确实如此......或者出于任何原因,编译器没有发现错误,然后在类中我们可以为它分配一个新值。这很可能不是您真正想要的。坏的。

更危险的是,如果您使用公共可见性,那么当然会有更多地方能够更改此变量 - 因此将更难确定问题来自何处。