gpt4 book ai didi

javascript - Flowtype:使可选属性成为必需的子类型

转载 作者:行者123 更新时间:2023-11-29 15:21:23 24 4
gpt4 key购买 nike

给定以下 Flow 类型别名(注意 payload 是一个可选属性):

type Action = { type: string, payload?: any }

我如何在 payload 中创建 Action 的子类型?不再是可选的了吗?

泛型对我没有任何帮助,因为它只适用于 payload 的类型本身,而不是它是可选的。最好我希望能够简单地做到这一点:

type MoreSpecificAction extends Action = { payload: any }

使用我知道的特定类型 payload不是可选的会让我避免很多未定义的检查。作为奖励,我也可以使类型更具体,但我已经可以使用泛型实现这一点。

解决方案

正如 Lewis 在接受的答案中所解释的那样,解决方案是将展开运算符与 $Exact<Action> 一起使用.然而,babel-eslint 目前不支持这种语法,但是有一个使用注释的解决方法。这是我的最终解决方案:

type LoadAttendeesAction = {
payload: Array<Attendee>,
/* :: ...$Exact<Action> */
};

需要注意的是 Action将需要在范围内,但 ESLint 不会考虑使用它,因此您可能需要:

// eslint-disable-line no-unused-vars

最佳答案

这是一个很好的时机。我刚刚在这里问了这件事:https://github.com/facebook/flow/issues/3534

你可以用这个做你想做的事:

type Action = {
type: string,
payload?: any
}

type MoreSpecificAction = {
payload: any,
...$Exact<Action>
}

请注意,目前,在这种情况下,“向下转型”似乎不会报告错误(从 Flow 0.44.1 开始):

const y: Action = {
type: 'ACTION'
};

(y: MyAction);

但除此之外,您将能够使用上面定义的 MoreSpecificAction 编写 action creators 和 reducers。

关于javascript - Flowtype:使可选属性成为必需的子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43564538/

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