使用 Maybe props 的类型不允许使用 Non-Maybe props 的类型

type with Maybe props doesn't allow type with Non-Maybe props

为什么流会在这里抛出错误?

type MaybeProp = {
  prop: ?number,
}

type DefinetlyProp = {
  prop: number,
}


const requireMaybe = (u: MaybeProp) => console.log(u)
const requireDefinetly = (u: DefinetlyProp) => requireMaybe(u)

https://flow.org/try/#0FDAuE8AcFMAIFkCG4BG0AKAnA9pWBeWAb2Flkh0gC5YB+AOwFcBbNTAGmAF8QIZYAItABmAS3rRQAG3BZcBYqXKUaTVtA7cQwAMbZ6AZ1CxM0AI6NRppKjiEAFIxo20cyAEoCAPlh7D2KWgAOilsAHNHd119IxNzS1MhMQlpcAVHGiTxSRk3T3wfUwsraBdoSKA

似乎可以处理属性的函数也应该能够处理定义明确定义的相同属性。

有什么办法解决这个问题?

这是因为JS中的对象是可变的。就类型系统而言,requireMaybe 可以执行 u.prop = null。然后,原始调用者期望 propnumber,但实际上是 null。这会破坏类型安全。

您可以使用 property variance:

来完成您想要的
type MaybeProp = {
  +prop: ?number,
}

type DefinetlyProp = {
  +prop: number,
}


const requireMaybe = (u: MaybeProp) => console.log(u)
const requireDefinetly = (u: DefinetlyProp) => requireMaybe(u)