Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular 2 OpaqueToken vs Angular 4 InjectionToken

InjectionToken was introduced in Angular 4 and OpaqueToken was marked as deprecated.

According to the manual, it is supposed to be used as

const anyToken = new InjectionToken('any');

for untyped token, and as

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

for typed token.

However, typed token still can be injected and used with different type when it is injected, TypeScript will be ok with this, won't it?

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

How is InjectionToken supposed to benefit from TypeScript type system?

Why was OpaqueToken deprecated if there's no practical difference between those two?

like image 653
Estus Flask Avatar asked Sep 09 '25 19:09

Estus Flask


1 Answers

Based on the internal usage of InjectionToken, for example, here, I assume that InjectionToken gives you type checking benefit when getting a dependency through injector instance:

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'.
    }
}
like image 167
Max Koretskyi Avatar answered Sep 12 '25 08:09

Max Koretskyi