Как набрать es6 генераторы с потоком - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть следующий (упрощенный) код в моем приложении-реактиве (я думаю, что реактивный-натив не имеет значения, но в этом контексте я обнаружил ошибку).

Я пытаюсь определитьвведите mystring и gen, чтобы сохранить flow довольным, но единственное решение, которое я нашел, это string|void, как показано ниже.Код ниже сам по себе не возвращает никаких ошибок с потоком, но как только я использую mystring в другом месте, я получаю ошибки, потому что ожидается string, а не void.Я играл с различными комбинациями, но не повезло.

Как мне исправить этот код, чтобы исправить ошибку?

// @flow
import * as React from 'react';

type State = {
    mystring: string|void,
};

type genType = Generator<string, void, void>;

export default class Example extends React.Component<{}, State> {
    constructor(props: {}) {
        super(props);
        this.gen = this.makeGenerator();
        const { value } = this.gen.next();
        this.state = {
            mystring: value,
        };
    }

    gen: genType;

    * makeGenerator(): genType {
        yield 'somestring';
    }

    render() {
        const { mystring } = this.state;
        return mystring.charAt(0);
    }
}

Редактировать:

Когдазапустив flow в приведенном выше коде, в последней строке (это пример того, как поток должен думать о mystring как о строке):

Cannot call mystring.charAt because property charAt is missing in undefined [1].
 [1]  5│     mystring?: string,

1 Ответ

0 голосов
/ 13 декабря 2018

Параметры типа ссылочного типа для 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

...