Angular 2 OpaqueToken vs Angular 4 InjectionToken

问题描述:

InjectionToken在Angular 4中引入,OpaqueToken被标记为已弃用。Angular 2 OpaqueToken vs Angular 4 InjectionToken

According to the manual,它应该被用作

const anyToken = new InjectionToken('any'); 

为无类型令牌,并且如

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

为类型化的令牌。

但是,键入的令牌仍然可以注入并在注入时使用不同的类型,TypeScript将会正常,不是吗?

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

InjectionToken如何从TypeScript类型系统中受益?

为什么OpaqueToken如果在这两者之间没有实际区别,我们不推荐使用?

基于对InjectionToken内部使用,例如,here,我认为InjectionToken为您提供了类型通injector实例越来越依赖时检查的好处:

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'. 
    } 
}