请考虑以下(live link):

type Range = { min: ?(number | string), max: ?(number | string) }
const myFn = (range: Range) => console.log(range)

type NumberRange = { min: ?number, max: ?number }
const aRange: NumberRange = { min: 0, max: 100 }
myFn(aRange)


流抱怨:


  无法将绑定到myFnaRange调用range,因为数字[1]与属性max中的字符串[2]不兼容。
  
  无法将绑定到myFnaRange调用range,因为数字[1]与属性min中的字符串[2]不兼容。


在我看来,NumberRange本质上是Range的子集,因此Flow在这种用法下应该没问题。有一个技巧可以使这项工作吗?

最佳答案

问题是对象是可变的,因此myFn可以做range.min = "foo"; range.max = "bar";,并且Range类型可以允许它,但是aRange将是带有字符串的NumberRange

如果通过在属性名称之前添加“ +”使Range的属性协变,则表示不允许myFn更改这些属性:

type Range = { +min: ?(number | string), +max: ?(number | string) }


Try Flow

10-06 00:00