javascript - 如何匹配联合类型中的不同键
问题描述
我不知道如何问这个......但希望代码示例应该澄清我在问什么:
type A = {| +type: "A", +payload: "PA" |};
type B = {| +type: "B", +payload: "PB" |};
type Actions = A | B;
function dispatch<T: Actions>(type: $PropertyType<T, 'type'>, payload: $PropertyType<T, 'payload'>) {
}
dispatch("A", "PA"); // ok
dispatch("B", "PB"); // ok
dispatch("A", "PB"); // this doesn't error, but I'd like to
dispatch("B", "PA"); // this doesn't error, but I'd like to
dispatch("C", "PC"); // this errors properly
解决方案
您需要一种允许根据键查找类型的类型,不幸的是,我认为标记的联合不允许这样做。例如,您可以将函数更改为:
type ActionsLookup = {
A: A,
B: B,
};
type Actions = $Values<ActionsLookup>;
function dispatch<K: $Keys<ActionsLookup>>(
type: K,
payload: $ElementType<$ElementType<ActionsLookup, K>, 'payload'>
) {}
推荐阅读
- makefile - 如何将存档文件与 C 代码链接?
- r - 如何在 group_nest 之后取消嵌套 tibble?
- php - 即使 ini 文件调用它,安装自定义 php 扩展也不会显示在 phpinfo() 中
- c++ - 模板显式实例化如何工作以及何时工作?
- python - 为 Azure Pipelines 安装通用包
- mysql - 自加入?前一周工作的员工是否在 3 周前活跃 - MYSQL
- reactjs - 如何以正确的“反应”方式重新编写此代码
- r - 基于单独的数据集有条件地将字符添加到新列
- node.js - 如何在 MongoDB 中保存小数高度
- ios - 根据字段值 Swift 分组对象