angular - Angular2 中的依赖注入(inject)语法

标签 angular typescript dependency-injection

在用 typescript 编写的 Angular 组件中,可以将类成员(变量)声明为构造函数的参数。我的问题是为什么要这样做。
为了让自己清楚,请参阅下面的片段。两者具有相同的含义。

  • 第一种是使用依赖注入(inject)机制定义私有(private)成员的经典方法(就像大多数 OO 语言中所做的那样)。
  • 如果我没记错的话,后者是 TypeScript 的特殊性。

export class HeroListComponent implements OnInit {
    // private member declaration
    private heroService:HeroService;

    // constructor signature
    constructor(service:HeroService) {
        // private member assignment
        this.heroService = service;
    }
}

export class HeroListComponent implements OnInit {
    // here the private member is declared inside the constructor signature
    constructor(private heroService:HeroService) { }
}

在我看来,对于不熟悉 TypeScript 的人来说,第一种语法更清晰、更容易理解。
所以,我想知道除了更短之外是否还有任何特殊原因(这并不重要,因为代码最终会被缩小/丑化),使用后者。谢谢。

最佳答案

编辑:此答案解决了原始问题(现已编辑),其中第二个示例如下所示:

export class HeroListComponent implements OnInit {
    // here the private member is declared inside the constructor signature
    constructor(private service:HeroService) { 
        this.heroService = service;
    }
}

在第二个示例中,您实际上创建了两个类属性。 this.servicethis.heroService 都将存在于您的对象中。

你的第二个例子就像这样做:

export class HeroListComponent implements OnInit {
    private heroService: HeroService;
    private service: HeroService;

    constructor(service:HeroService) {
        this.service = service;
        this.heroService = service;
    }
}

如果您的类属性可以与构造函数中的参数具有相同的名称,那么第二个示例中的样式将使您受益。如果它们都可以命名为heroService,那么您可以这样做:

export class HeroListComponent implements OnInit {
    constructor(private heroService:HeroService) {  }
}

好处就是它消除了困惑。类中属性的声明以及构造函数参数对该类属性的赋值都消失了。它不一定对您来说更干净或更易读。

关于angular - Angular2 中的依赖注入(inject)语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46265819/

相关文章:

javascript - 如何在 Typescript 中定义类型安全的动态接口(interface)

node.js - 如何声明同名的接口(interface)、函数和变量?

javascript - 检测输入值的更改 - vue2

java - Guice 包装通用注入(inject)

javascript - Angular2 中优化的数据绑定(bind)机制如何工作

angular - *ngif - 如果某些东西变得可见则隐藏 div

angular - Microsoft Edge 在导航到 Angular 2 上的路线后添加参数

c# - Service owns disposable Repository that owns disposable DbContext - Dispose IDisposables injected with Unity

java - 从另一个 jar 添加到 spring 接口(interface)实现

javascript - Angular:使用 MockBackend 测试 HTTP,真的需要 async() 吗?