Ich war überrascht zu sehen, dass this example nicht funktioniert typecheck:Fließen die Verfeinerungen nicht "nach oben"?
/* @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`
Fluss weiß es state.flag
zu true
verfeinern, aber es weiß nicht, dass state
-{ flag: true }
verfeinert werden kann. Wird das erwartet?
Es ist nicht gesund sein würde vorbei 'state' zu' secondStep' zu ermöglichen, weil 'secondStep' zu' state' zu einem Referenzfesthalten konnte, dann 'firstStep' könnte mutieren' state.flag' auf false gesetzt. Disjunkt Gewerkschaften zu beheben, dass, weil 'flag' effektiv unveränderlich, wenn Sie in einem Zweig der Vereinigung oder die andere sind. –
Guter Fang. Ich bearbeite meine Antwort, um diese Informationen hinzuzufügen. –
Ah, wirklich interessanter Punkt @RyanCavanaugh. Ich habe mich gefragt, ob so etwas nicht der Fall war. Schade! –