首页 > 解决方案 > 在依赖注入中使用只读

问题描述

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

constructor(readonly private userService: UserService) { }

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

标签: angulartypescriptnestjs

解决方案


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

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

private readonly userService: UserService

所以 readonly 出现在 private 之后。

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

public/private/protected是关于可见性的。

  • public:任何人都可以看到这个变量
  • private:变量仅在您定义它的类内部可见
  • protected:仅在内部类和派生类中可见(A 扩展 B)

另一方面,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% 的依赖注入。

当您以私有 userService: UserService的方式注入服务时,可以更改此变量。但是,由于 Typescript,它只能被分配一个新的 UserService 实例,所以无论你是否设置 readonly,它并没有太大的区别。

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

constructor(private numberOfPizzas: number) {}

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

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


推荐阅读