Angular 2打字稿中@Inject和@Injectable有什么区别

What is the difference between @Inject and @Injectable in Angular 2 typescript

我不明白什么时候使用@Inject,什么时候使用@Injectable?

  import {Component, Inject, provide} from '@angular/core';
    import {Hamburger} from '../services/hamburger'; 
    export class App {
       bunType: string;
       constructor(@Inject(Hamburger) h) {
         this.bunType = h.bun.type;
       }
     }

还有..

  import {Injectable} from '@angular/core';
    import {Bun} from './bun';
    @Injectable()
    export class Hamburger {
      constructor(public bun: Bun) {
      }
    }

@Injectable 装饰器的目的是实际设置一些元数据,关于将哪些依赖项注入到关联的 class 的构造函数中。这是一个不需要参数的 class 装饰器。如果没有这个装饰器,将不会注入任何依赖...

@Injectable()
export class SomeService {
  constructor(private http:Http) {
  }
}

必须在构造函数参数级别使用 @Inject 装饰器来指定有关要注入的元素的元数据。没有它,使用参数的类型(obj:SomeType 等同于 @Inject(SomeType) obj)。

@Injectable()
export class SomeService {
  constructor(@Inject(Http) private http:Http, @Inject('sometoken') obj) {
  }
}

你一定要读懂这个区别- @Inject and @Injectable

@Inject()

是一种让Angular知道必须注入参数的手动机制。

使用 TypeScript 时,@Inject 仅用于注入原语。 例如:

export class AppComponent {
  encryption = this.chatWidget.chatSocket.encryption;

  constructor(@Inject(ChatWidget) private chatWidget) { }
}

@Injectable()

让 Angular 知道 class 可以与依赖项一起使用 注射器。

例如:

@Injectable()
export class ChatWidget {
constructor(
    public authService: AuthService,
    public authWidget: AuthWidget,
    public chatSocket: ChatSocket) { }
}

在上面的示例中,Angular 的注入器使用类型信息确定将什么注入到 ChatWidget 的构造函数中