javascript - 通过条件缩小联合类型
问题描述
假设我有以下类型:
type MyCustomAction = {|
type: "MY_CUSTOM_ACTION",
payload: string
|}
type MyCustomAction2 = {|
type: "MY_CUSTOM_ACTION2",
data: number
|}
type CustomAction = MyCustomAction2 | MyCustomAction
const MyCustomFunction = (action: CustomAction): void => {
const type = action.type
if (type === "MY_CUSTOM_ACTION") {
let payload = action.payload
} else if (type === "MY_CUSTOM_ACTION2") {
let data = action.data
}
}
这失败了:
21: let payload = action.payload ^ Cannot get `action.payload` because property `payload` is missing in `MyCustomAction2` [1].
References:
17: const MyCustomFunction = (action: CustomAction): void => {
^ [1]
23: let data = action.data ^ Cannot get `action.data` because property `data` is missing in `MyCustomAction` [1].
References:
17: const MyCustomFunction = (action: CustomAction): void => {
^ [1]
是否可以像这样切换类型?为什么流无法检测到 MyCustomAction 将始终具有有效负载?
解决方案
似乎是流编译器中的一个问题,但是如果您直接使用对象字段,它可以正常工作:)
type MyCustomAction = {|
type: "MY_CUSTOM_ACTION",
payload: string
|}
type MyCustomAction2 = {|
type: "MY_CUSTOM_ACTION2",
data: number
|}
type CustomAction = MyCustomAction2 | MyCustomAction
const MyCustomFunction = (action: CustomAction): void => {
if (action.type === 'MY_CUSTOM_ACTION') {
const payload = action.payload;
} else if (action.type === 'MY_CUSTOM_ACTION2') {
const data = action.data;
}
};
推荐阅读
- apache-spark - SparkContext:运行 Spark 作业时初始化 SparkContext 时出错
- html - 如果输入标签中的文本已经存在于数组中,则替换它们
- powershell - 枚举 URL Scheme 表单 powershell
- ios - InAppBrowser IOS 14
- r - R循环从几个后续行子集信息并创建新列
- vue.js - 将成分添加到购物清单
- javascript - 从字符串列表创建树 - javascript
- javascript - ES6 解构并作为参数一起传播到 React 组件中
- c# - 具有来自 itemsource 或用户输入的选定值(路径)的可编辑组合框
- python - 使用 cvtColor() 函数将我的图像转换为灰度的问题