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