Параметры типа ссылочного типа для Generator
выглядят так:
interface Generator<+Yield,+Return,-Next>
И когда вы звоните next()
, вы получаете результат этого типа:
type IteratorResult<+Yield,+Return> =
| { done: true, +value?: Return }
| { done: false, +value: Yield };
Выв случае done: true
можно увидеть, что Flow предполагает, что свойство value
в результате может отсутствовать.Это означает, что независимо от того, как вы наберете свой генератор, Flow предполагает, что в этом случае тип value
может быть void
.Но в случае done: false
Flow будет использовать любой тип, указанный вами как тип генератора Yield
.Таким образом, вы можете проверить значение done
, чтобы уточнить тип value
следующим образом:
const result = this.gen.next();
if (!result.done) {
this.state = {
mystring: result.value,
};
}
Проверка для !result.done
уточняет тип от result
до { done: false, +value: Yield }
, что даеттип string
для value
, без возможности для значения void
.
С этим изменением вы можете обновить тип состояния, удалив void
из объединения типов для mystring
:
type State = {
mystring: string,
};
Определения Generator
и IteratorResult
выше взяты из стандартных определений типов Flow, которые вы можете увидеть здесь:
https://github.com/facebook/flow/blob/master/lib/core.js