Flow不允许对象与更严格的版本匹配

问题描述 投票:0回答:2

考虑以下(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抱怨:

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

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

在我看来NumberRange本质上是Range的一个子集,所以Flow应该没有这个用法。是否有一个技巧使这项工作?

javascript types flowtype
2个回答
1
投票

问题是对象是可变的,所以myFn可以做range.min = "foo"; range.max = "bar";,它将被Range类型允许,但然后aRange将是一个带字符串的NumberRange

如果你通过在属性名称之前添加“+”来创建Range协变的属性,那么你说myFn不允许改变这些属性:

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

Try Flow


1
投票

如果你不打算混合minmax的类型,你可以使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)
© www.soinside.com 2019 - 2024. All rights reserved.