Я считаю, что это должно быть возможно в машинописном тексте, но я еще не достиг уровня просвещения машинописного текста, необходимого для 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.