Подтвердить что ты не робот

Angular 2 OpaqueToken vs Angular 4 InjectionToken

InjectionToken был введен в Angular 4, а OpaqueToken отмечен как устаревший.

Согласно руководству, предполагается использовать его как

const anyToken = new InjectionToken('any');

для нетипизированного токена и

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

для введенного токена.

Однако, введенный токен все еще может быть введен и использован с другим типом при его вводе, TypeScript будет в порядке с этим, не так ли?

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

Как InjectionToken предполагается использовать систему типов TypeScript?

Почему OpaqueToken устарел, если нет никакой практической разницы между этими двумя?

4b9b3361

Ответ 1

Основываясь на внутреннем использовании 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'.
    }
}