Angular 2 OpaqueToken vs Angular 4 InjectionToken

时间:2017-04-14 20:49:26

标签: angular typescript

Angular 4中引入了

InjectionTokenOpaqueToken被标记为已弃用。

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被弃用,如果这两者之间没有实际区别?

1 个答案:

答案 0 :(得分:25)

根据InjectionToken的内部用法,例如here,我假设InjectionToken在通过injector实例获取依赖关系时为您提供类型检查优势:< / p>

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