InjectionToken se introdujo en Angular 4 y OpaqueToken se marcó como obsoleto.
Según el manual , se supone que debe usarse como
const anyToken = new InjectionToken('any');para token sin tipo, y como
const numberToken = new InjectionToken<number>('number');para el token escrito.
Sin embargo, el token escrito aún se puede inyectar y usar con un tipo diferente cuando se inyecta, TypeScript estará bien con esto, ¿no?
constructor(@Inject(numberToken) any, @Inject(numberToken) string: string) { ... } ¿Cómo se supone que InjectionToken se beneficiará del sistema de tipo TypeScript?
¿Por qué OpaqueToken quedó en desuso si no hay una diferencia práctica entre esos dos?
Basado en el uso interno de InjectionToken , por ejemplo, aquí , asumo que InjectionToken le brinda el beneficio de verificación de tipos cuando obtiene una dependencia a través de la instancia del 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'. } }