Flow не позволяет объекту, который соответствует более строгой версии - PullRequest
0 голосов
/ 04 марта 2019

Рассмотрим следующее ( действующая ссылка ):

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] несовместимо со строкой [2] в свойстве max.

Невозможно вызвать myFn, когда aRange связано с range, поскольку число [1] несовместимо со строкой [2] в свойстве min.

Мне кажется, NumberRange - это, по сути, подмножество Range, поэтому Flow должен быть в порядке с этим использованием.Есть ли хитрость, чтобы заставить это работать?

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Проблема в том, что объекты являются изменяемыми, поэтому myFn может делать range.min = "foo"; range.max = "bar";, и это будет разрешено типом Range, но тогда aRange будет NumberRange со строками!

если вы сделаете свойства Range ковариантными, добавив "+" перед именами свойств, вы скажете, что myFn не разрешено изменять эти свойства:

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

Попробуйте Flow

0 голосов
/ 04 марта 2019

Если вы не планируете смешивать типы 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)
...