请考虑以下(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)
流抱怨:
无法将绑定到
myFn
的aRange
调用range
,因为数字[1]与属性max
中的字符串[2]不兼容。无法将绑定到
myFn
的aRange
调用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