我相信这在打字稿中必须是可行的,但是我还没有达到表达这一要求的打字稿启蒙水平。
我正在尝试键入一个简单的发布/订阅服务。该服务将具有一个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等的类型。