考虑以下(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)
Flow抱怨:
无法调用
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) }
如果你不打算混合min
和max
的类型,你可以使Range
成为联盟类型。
type NumberRange = { min: ?number, max: ?number }
type StringRange = { min: ?string, max: ?string }
type Range = NumberRange | StringRange
const myFn = (range: Range) => console.log(range)
const aRange: NumberRange = { min: 0, max: 100 }
myFn(aRange)