首页 > 解决方案 > 将回调类型作为函数,接受几种可能类型之一的参数

问题描述

我相信这在打字稿中一定是可能的,但我还没有达到表达这一点所需的打字稿启蒙水平。

我正在尝试输入一个简单的发布/订阅服务。该服务将具有一个subscribe函数,该函数接受一个回调函数并将其添加到一个函数数组中,以便在消息到达时调用。我想要实现的是键入传递给函数的回调subscribe函数。这是代码的简化版本(点击在 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)),因为每个回调函数都采用一种消息类型,但只采用其中一种,而不是它们的联合。subscribe 有没有办法单独根据 IncomingMessage 参数的类型正确键入作为参数传递的回调函数?我相信如果我只是自己创建了一个联合类型的回调函数并将其传递给subscribe,它会很高兴;但我不想这样做,而且我怀疑有一种方法可以在不明确列出 fn1、fn2 等类型的情况下做到这一点。

标签: typescript

解决方案


推荐阅读