typescript - 将回调类型作为函数,接受几种可能类型之一的参数
问题描述
我相信这在打字稿中一定是可能的,但我还没有达到表达这一点所需的打字稿启蒙水平。
我正在尝试输入一个简单的发布/订阅服务。该服务将具有一个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 等类型的情况下做到这一点。
解决方案
推荐阅读
- javascript - 共享非全屏应用程序窗口时,Chrome getDisplayMedia 流被裁剪
- python - ast.literal_eval() 在具有空键值的字典上
- visual-studio-2019 - 查找 (Ctrl+D) 的 Visual 2019 旧快捷方式现在重复一行
- regex - 为什么 Google Cloud Builder 不使用 gsutil rsync -x 排除文件?
- wordpress - WordPress、WooCommerce:如何从独立类中获取选项
- java - 无法部署“中心图像 ID:一些/中心:最新”:java.lang.NullPointerException
- macos - 从 Mac 节点上的 Jenkinsfile 运行自制软件时出现权限错误
- python-3.x - Azure 函数未接收 Eventhub 事件
- xml - 使用rentrez包从NCBI核苷酸结果中提取元信息
- c++ - 在 C++ 中使用 ITK 计算 PCA