Я был удивлен видеть, что this example не typecheck:Уточнения потока не распространяются «вверх»?
/* @flow */
type State = { flag: boolean }
function firstStep(state: State) {
if (state.flag) {
secondStep(state)
// this works though:
// secondStep({ flag: state.flag })
}
}
function secondStep(state: { flag: true }) {}
3: type State = { flag: boolean }
^boolean. Expected boolean literal `true`
13: function secondStep(state: { flag: true }) {}
^boolean literal `true`
Flow знает, что может уточнить state.flag
к true
, но он не знает, что state
может быть уточнена в { flag: true }
. Это ожидалось?
Неправильно разрешить передачу 'state'' secondStep', потому что 'secondStep' может удерживать ссылку на' state', тогда 'firstStep' может мутировать' state.flag' в false. Развязанные объединения фиксируют это, потому что 'flag' является фактически неизменным, когда вы находитесь в одной ветви профсоюза или другой. –
Хороший улов. Я отредактирую свой ответ, чтобы включить эту информацию. –
Ах, действительно интересный момент @ RyanCavanaugh. Мне было интересно, было ли что-то вроде этого. Вот досада! –