Angular 2 OpaqueToken vs Angular 4 InjectionToken

Est*_*ask 26 typescript angular

InjectionToken在Angular 4中引入OpaqueToken并被标记为已弃用.

根据手册,它应该被用作

const anyToken = new InjectionToken('any');
Run Code Online (Sandbox Code Playgroud)

对于无类型的令牌,以及

const numberToken = new InjectionToken<number>('number');
Run Code Online (Sandbox Code Playgroud)

对于键入的令牌.

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

constructor(@Inject(numberToken) any, @Inject(numberToken) string: string) { ... }
Run Code Online (Sandbox Code Playgroud)

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

OpaqueToken如果这两者之间没有实际差异,为什么被弃用?

Max*_*kyi 27

根据InjectionToken例如此处的内部用法,我假设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'.
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 使用这些injectTokens的好处是什么,而不仅仅是导入常量.我理解这些令牌在测试时很容易被嘲笑?除此之外??这只是共享常量的很多代码.. (2认同)