Введите обратный вызов как функцию, которая принимает аргумент одного из нескольких возможных типов - PullRequest
0 голосов
/ 06 августа 2020

Я считаю, что это должно быть возможно в машинописном тексте, но я еще не достиг уровня просвещения машинописного текста, необходимого для express this.

Я пытаюсь напечатать простую службу pub / sub. Служба будет иметь функцию subscribe, которая принимает функцию обратного вызова и добавляет ее в массив функций, которые будут вызываться при поступлении сообщения. Я пытаюсь ввести функцию обратного вызова, переданную функции subscribe. Вот упрощенная версия кода ( щелкните, чтобы увидеть его на игровой площадке машинописного текста ).

type IncomingMessage1 = {
    action: 'foo';
    payload: { 
        foo: number;
     }
};

type IncomingMessage2 = {
    action: 'bar';
    payload: { 
        bar: number;
     }
};

type IncomingMessage = IncomingMessage1 | IncomingMessage2;

const fn1 = (message: IncomingMessage1) => 'i am returning something';

const fn2 = (message: IncomingMessage2) => {
    // i am not returning anything
};


const stash: Array<<M extends IncomingMessage>(message: M) => unknown> = [];

const subscribe = <M extends IncomingMessage>(callback: (message: M) => unknown) => {
    stash.push(callback);
};

subscribe(fn1);

Это, конечно, неверно (машинописный текст показывает ошибку на stash.push(callback)), потому что каждая функция обратного вызова принимает один из типов сообщений, но только один из них, а не их объединение. Есть ли способ правильно ввести функцию обратного вызова, переданную в качестве аргумента в subscribe , на основе только типа аргумента IncomingMessage ? Я считаю, что если бы я просто создал объединенные функции обратного вызова и передал их в subscribe, я был бы счастлив; но я не хочу этого делать и подозреваю, что есть способ сделать это без явного перечисления типов fn1, fn2, et c.

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