2017-04-14 16 views
19

InjectionToken wurde in Angular 4 eingeführt und OpaqueToken wurde als veraltet markiert.Angular 2 OpaqueToken vs Angular 4 InjectionToken

According to the manual wird angenommen, wie für untypisierten Token

const anyToken = new InjectionToken('any'); 

verwendet werden, und als

const numberToken = new InjectionToken<number>('number'); 

für typisierte Token.

Allerdings kann typisierte Token noch injiziert werden und mit anderen Typen verwendet werden, wenn es injiziert wird, wird TypeScript damit einverstanden sein, nicht wahr?

constructor(@Inject(numberToken) any, @Inject(numberToken) string: string) { ... } 

Wie wird InjectionToken soll von Typoskript Typ-System profitieren?

Warum wurde OpaqueToken veraltet, wenn es keinen praktischen Unterschied zwischen diesen beiden gibt?

Antwort

16

Basierend auf dem internen Gebrauch von InjectionToken zum Beispiel here, nehme ich an, dass InjectionToken gibt Sie Leistungsart Überprüfung, wenn eine Abhängigkeit durch injector Instanz erhalten:

import {Component, InjectionToken, Injector} from "@angular/core"; 
interface AppConfig { 
    name: string; 
} 

let APP_CONFIG = new InjectionToken<AppConfig>('app.config'); 
let appConfig: AppConfig = {name: 'Cfg'}; 

@Component({ 
    ... 
    providers: [{provide: APP_CONFIG, useValue: appConfig}] 
}) 
export class TestComponent { 
    constructor(injector: Injector) { 
     const config = injector.get(APP_CONFIG); 
     config.s = 'd'; 
      ^^^^^ - Error:(14, 16) TS2339:Property 's' does not exist on type 'AppConfig'. 
    } 
}