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?
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'.
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With