gpt4 book ai didi

redux - 如何避免使用文字字符串来缩小流程中不相交的联合

转载 作者:行者123 更新时间:2023-12-03 17:39:19 26 4
gpt4 key购买 nike

我在网上找到的用于缩小 flowtype 中不相交联合的所有示例都使用字符串文字,例如 the official one .我想知道是否有办法检查枚举中的值,例如:

const ACTION_A = 'LITERAL_STRING_A';
const ACTION_B = 'LITERAL_STRING_B';

type ActionA = {
// This is not allowed
type: ACTION_A,
// type: 'LITERAL_STRING_A' is allowed
dataA: ActionAData,
}

type ActionB = {
// This is not allowed
type: ACTION_B,
// type: 'LITERAL_STRING_B' is allowed
dataB: ActionBData,
}

type Action = ActionA | ActionB;

function reducer(state: State, action: Action): State {
// Want to narrow Action to ActionA or ActionB based on type
switch (action.type) {
// case 'LITERAL_STRING_A': -- successfully narrow the type
case ACTION_A: // doesn't work
// action.dataA is accessible
...
}
...
}

不幸的是,您不能这样做,因为字符串不符合类型注释的条件。

如果有任何其他方法可以解决这个问题,不会强制在我想知道的任何地方输入字符串文字。

如果没有办法解决这个问题,也接受更高级别的建议,如何不需要为 redux 操作定义这些不相交的集合。

最佳答案

我现在不是最好的状态,如果我读错了你的问题,很抱歉。无论如何,我会尽力提供帮助。这是你要找的吗?

const actionTypes = {
FOO: 'FOO',
BAR: 'BAR'
}

type ActionType = $Keys<actionTypes> // one of FOO, BAR

function buzz(actionType: ActionType) {
switch(actionType) {
case actionTypes.FOO:
// blah
}

这应该有效。对不起,如果我的语法有点不对。

如果您问如何避免在 type Action = ActionA | ActionB 中列出所有操作类型那么对不起,我不知道,我认为这就是你的方式。如果我没记错的话,最近在 Flow 中引入了一种更好的定义长联合的语法:
type Action =
| ActionA
| ActionB
| ActionC

此外,如果您不需要单独的操作类型,您可以这样做
type Action =
| {type: ACTION_A; dataA: ActionAData;}
| {type: ACTION_B; dataB: ActionBData;}

关于redux - 如何避免使用文字字符串来缩小流程中不相交的联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40076640/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com