Как избежать ошибки типизации потока с пустым массивом? - PullRequest
0 голосов
/ 06 октября 2019

Я столкнулся с ошибкой потока, которую я считаю ложноотрицательным. Вот мой соответствующий код:

export type ValidationError = {
  name: string,
  id?: number,
  message: string
}

const determineErrorMessage = (name: string) => {
  if (!_.isEmpty(validationErrors)) {
    const error: ValidationError = validationErrors.find(error => error.name === name);

    if (error) {
      return (
        <Form.Label className={classes.errorMessage}>
          {error.message}
        </Form.Label>      
      );
    } else {
      return null;
    }
  } else {
    return null;
  }
}

Ошибка с этой частью кода:

validationErrors.find(error => error.name === name)

Поток говорит следующее:

Cannot assign `validationErrors.find(...)` to `error` because  undefined [1] is incompatible with  `ValidationError` 

Я имеюПрочитав немного об этом, вы даже обратились к соответствующей странице документации Flow: https://flow.org/en/docs/types/arrays/ Примерно на 2/3 пути вниз по этой странице написано: «Поскольку Flow сделан умнее, возможно, в будущем будет возможно исправитьэта проблема, но на данный момент вы должны знать об этом. "

Должен ли я просто признать, что я не сделал ничего плохого и что поток будет улучшаться в будущем?

1 Ответ

1 голос
/ 07 октября 2019

Поток указывает на допустимую ошибку здесь.

const error: ValidationError = 

должно быть

const error: ValidationError | void =

, поскольку find вернет undefined, если ничего не будет найдено.

Однако, если предположить, что validationErrors былообъявленный как Array<ValidationError>, тогда вам не нужно включать : ValidationError в первую очередь, потому что Flow знает, что данный Array<T>, тогда find возвращает T | void, что позволяет вам сделать

const error =
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...