Angular директива как установить тип c контекстной переменной generi? - PullRequest
0 голосов
/ 19 июня 2020

Я столкнулся с той же проблемой из этого вопроса , и, поскольку там нет ответа, я попытаюсь спросить.

Я создал директиву ngStream, которая будет подписываться к наблюдаемому и автоматически c отказаться от подписки после уничтожения компонента, я знаю, что канал async существует, но для него требуется массив типа: Observable<T[]>, поэтому я решил создать эту директиву, которая позволяет подписаться на обычный Observable<T> и мне не нужно генерировать массив из одного элемента, вот что у меня есть, и он работает:

export class NgStreamDirective implements OnDestroy {
    @Input('ngStreamOf') set values(obs: Observable<any>) {
        this.subscription = obs.subscribe((o) => {
            this.value = o;

            if (this.embeddedRef === undefined) {
                this.embeddedRef = this._viewContainer.createEmbeddedView(this._template, { "\$implicit": this.value });
            } else {
                this.embeddedRef.context.$implicit = this.value;
                this.embeddedRef.detectChanges();
            }
        });
    }

    private subscription: Subscription;
    private value: any;

    private embeddedRef: EmbeddedViewRef<any>;

    constructor(
        private _template: TemplateRef<any>,
        private _viewContainer: ViewContainerRef
    ) {}

    ngOnDestroy(): void {
        this.subscription.unsubscribe();
    }
}

Я планирую улучшить этот код, но сейчас мне просто нужно чтобы он работал правильно, и он работает, единственная проблема в том, что я не могу определить тип generi c для моего value, например:

*ngFor="let i of [0, 1, 2...]"

В этом случае переменная i будет иметь тип number, если я изменю тип списка, переменная также изменит свой тип, как вы, вероятно, знаете.

В моем случае:

observable$: Observable<String>
*ngStream="let stream of observable$"

Переменный поток имеет тип any, и я не могу понять способ установки типа возврата, я также видел эту проблему , которая, похоже, имеет ту же проблему и не имеет решения.

...