带有Maybe的类型道具不允许带有Non-Maybe道具的类型

时间:2017-06-21 10:37:01

标签: javascript flowtype

为什么流量抛出错误?

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

似乎一个可以处理可能属性的函数也应该能够在它们被明确定义时处理相同的属性。

有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

这是因为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)