Flowtype:需要可选属性的子类型

时间:2017-04-22 20:56:44

标签: javascript flowtype

给定以下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

1 个答案:

答案 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编写您的动作创建者和缩减者。