Typescript: проверка типа функции, переданной в качестве аргумента - PullRequest
0 голосов
/ 04 февраля 2020

Итак, у меня есть следующая идея: я хотел бы описать функцию, которая принимает наблюдаемый 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
  }

Так что теперь обратные вызовы возвращают что-то, а не ничего, как ожидалось. Что мне здесь не хватает и как я могу получить сообщение об ошибке, если подпись функции обратного вызова неверна? Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Вместо этого вы должны набрать never:

export interface ServiceSubscriber<T> {
  (providedObservable: Observable<T>, onNext: OnNextHandler<T>): never
}

Я считаю, что это должно сработать.

0 голосов
/ 04 февраля 2020

Объяснение этому есть в другом ответе здесь .

Короткий ответ заключается в том, что spe c принимает значение void, равное

«не заботиться о типе возвращаемого значения»

вместо

«строго не возвращает значения»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...