将回调类型作为函数,该函数接受几种可能类型之一的参数

时间:2020-08-06 13:23:53

标签: typescript

我相信这在打字稿中必须是可行的,但是我还没有达到表达这一要求的打字稿启蒙水平。

我正在尝试键入一个简单的发布/订阅服务。该服务将具有一个subscribe函数,该函数带有一个回调函数,并将其添加到消息到达时要调用的函数数组中。我想要实现的是键入传递给subscribe函数的回调函数。这是代码的简化版本(click to see it in typescript playground)。

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)处显示错误),因为每个回调函数都采用一种消息类型,但是只使用一种,而不是它们的并集。是否有一种方法可以仅基于IncomingMessage参数的类型正确键入作为参数传递给subscribe 的回调函数??我相信,如果我自己创建一个联合类型的回调函数并将其传递给subscribe,那将会很高兴;但是我不想这样做,而且我怀疑有一种方法可以不用明确列出fn1,fn2等的类型。

0 个答案:

没有答案