Итак, у меня есть следующая идея: я хотел бы описать функцию, которая принимает наблюдаемый Rx Js, предоставляемый некоторым сервисом, в качестве первого аргумента и обработчик функции OnNext, который будет передан методу подписки.
import { Observable } from 'rxjs';
export interface OnNextHandler<T> {
(value: T): void
}
export interface ServiceSubscriber<T> {
(providedObservable: Observable<T>, onNext: OnNextHandler<T>): void
}
Кажется, что приведенный выше код работает, хотя в некоторых случаях TS не выдает ошибку (и я бы хотел, чтобы это произошло). Например:
@Component({
selector: 'app-notes-list',
templateUrl: './notes-list.component.html',
styleUrls: ['./notes-list.component.scss']
})
export class NotesListComponent implements OnInit, OnDestroy {
activeNotes: Note[] = [];
archivedNotes: Note[] = [];
private destroy$: Subject<boolean> = new Subject<boolean>();
constructor(
private notesService: NotesService
) { }
ngOnInit() {
const { active, archived } = this.notesService; // pull our observables from the service
this.subscribeTo(active, activeNotes => this.activeNotes = activeNotes);
this.subscribeTo(archived, archivedNotes => this.archivedNotes = archivedNotes);
}
ngOnDestroy(): void {
this.destroy$.next(true);
this.destroy$.unsubscribe();
}
private subscribeTo: ServiceSubscriber<Note[]> = (providedObservable$, onNext) => {
providedObservable$
.pipe(takeUntil(this.destroy$))
.subscribe(onNext)
}
}
Это один из компонентов Angular, в котором я пытаюсь ввести метод subscribeTo
с моим ServiceSubscriber
интерфейсом. Первый аргумент проверяется: например, когда мы передаем строку вместо ожидаемого Observable
, но второй аргумент (обратный вызов onNext) может получить любую функцию в качестве значения (и я хочу, чтобы она была функцией, которая принимает аргумент типа T
и вернуть ничего ). Для демонстрации, если я изменю код внутри ngOnInit
на что-то вроде этого:
ngOnInit() {
const { active, archived } = this.notesService;
this.subscribeTo(active, activeNotes => activeNotes); // pay attention here on the 2nd arg
this.subscribeTo(archived, archivedNotes => archivedNotes); // and here as well
}
Так что теперь обратные вызовы возвращают что-то, а не ничего, как ожидалось. Что мне здесь не хватает и как я могу получить сообщение об ошибке, если подпись функции обратного вызова неверна? Спасибо.