考虑以下内容(活链):
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。有什么办法能让这件事成功吗?
发布于 2019-03-05 14:19:29
问题是对象是可变的,所以myFn可以执行range.min = "foo"; range.max = "bar";,Range类型允许它,但是aRange将是一个包含字符串的NumberRange!
如果通过在属性名称之前添加"+“来生成Range的属性,则表示不允许myFn对这些属性进行变异:
type Range = { +min: ?(number | string), +max: ?(number | string) }发布于 2019-03-04 17:32:16
如果不打算混合min和max的类型,则可以将Range改为Union类型。
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)https://stackoverflow.com/questions/54987774
复制相似问题