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

Javascript Flowtype:使可选属性成为必需的子类型,javascript,flowtype,Javascript,Flowtype,给定以下流类型别名(请注意,payload是可选属性): 我如何创建一个动作的子类型,其中有效负载不再是可选的 泛型不能让我有任何进展,因为它只对负载类型本身有效,而不是它是可选的。最好我能做到这一点: type MoreSpecificAction extends Action = { payload: any } 使用我知道的有效负载不是可选的特定类型可以避免大量未定义的检查。作为奖励,我还可以使类型更加具体,但我已经可以使用泛型实现这一点 解决方案 正如Lewis在接受的答案中所解释的,

给定以下流类型别名(请注意,
payload
是可选属性):

我如何创建一个动作的子类型,其中
有效负载
不再是可选的

泛型不能让我有任何进展,因为它只对
负载类型本身有效,而不是它是可选的。最好我能做到这一点:

type MoreSpecificAction extends Action = { payload: any }
使用我知道的
有效负载
不是可选的特定类型可以避免大量未定义的检查。作为奖励,我还可以使类型更加具体,但我已经可以使用泛型实现这一点

解决方案 正如Lewis在接受的答案中所解释的,解决方案是使用spread运算符和
$Exact
。然而,babel eslint目前不支持这种语法,但有一种使用注释的变通方法。以下是我的最终解决方案:

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

这是个好时机。我刚才在这里问了一件事:

您可以使用以下命令执行您想要的操作:

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

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

除此之外,您还可以使用上面定义的
MoreSpecificAction
编写动作创建者和还原者。

Awesome。babel eslint中的spread语法似乎存在一个突出的问题,但有一个使用注释的解决方法:顺便问一下,没有导入
$Exact
是否正确?它似乎有效,但感觉不对。是的,这是正确的,$Exact是一种全局实用类型。
// eslint-disable-line no-unused-vars
type Action = {
  type: string,
  payload?: any
}

type MoreSpecificAction = {
  payload: any,
  ...$Exact<Action>
}
const y: Action = {
  type: 'ACTION'
};

(y: MyAction);