请考虑以下(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抱怨:
无法调用绑定到{{1}的
myFn
的{{1}},因为数字[1]与属性aRange
中的字符串[2]不兼容。无法调用绑定到{{1}的
range
的{{1}},因为数字[1]与属性max
中的字符串[2]不兼容。
在我看来myFn
本质上是aRange
的子集,因此使用这种用法Flow应该没问题。有一个技巧可以使这项工作成功吗?
答案 0 :(得分:1)
如果您不打算混合使用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)
答案 1 :(得分:1)
问题在于对象是易变的,因此myFn
可以range.min = "foo"; range.max = "bar";
进行操作,而Range
类型则允许,但是aRange
将是{{ 1}}和字符串!
如果通过在属性名称前添加“ +”来使NumberRange
的属性协变,则表示Range
不允许对这些属性进行突变:
myFn