给定以下Flow类型别名(请注意payload
是可选属性):
type Action = { type: string, payload?: any }
我如何创建一个Action的子类型,其中payload
不再可选?
泛型并没有把我带到任何地方,因为它只适用于payload
本身的类型,而不是它可选的事实。我希望能够简单地做到这一点:
type MoreSpecificAction extends Action = { payload: any }
使用我知道payload
不可选的特定类型将允许我避免大量未定义的检查。作为奖励,我可以使类型更具体,但我已经可以使用泛型实现这一点。
正如刘易斯接受的答案中所解释的那样,解决方案是使用扩展运算符和$Exact<Action>
。但是,babel-eslint目前不支持这种语法,但是有一种使用注释的解决方法。这是我的最终解决方案:
type LoadAttendeesAction = {
payload: Array<Attendee>,
/* :: ...$Exact<Action> */
};
有一点需要注意,Action
需要在范围内,但ESLint不会考虑使用它,因此您可能需要:
// eslint-disable-line no-unused-vars
答案 0 :(得分:1)
这是合适的时间。我刚刚在这里询问了这个问题: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
编写您的动作创建者和缩减者。