Почему flowtype думает, что моя переменная не определена? - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть объявление объекта flowtype, которое выглядит так:

   type ProjectType = {
     // removed for brevity
     releases?: Array<ReleaseType>
   }

Бывают случаи, когда выпуски не включены в объект, поэтому, когда я хочу использовать его, я сначала проверяю его. Итак, здесь, позже в моем коде, я получаю доступ к этому массиву после такого условия:

   if (selectedProject
      && selectedProject.releases
      && selectedProject.releases.length) {
      majorReleasesSet = new Set(selectedProject.releases.map((release: ReleaseType): string => (
        release.major)));
      projectHasNoReleases = false;
      projectLatestMajorRelease = selectedProject.releases.slice(-1)[0].major;
      projectLatestMinorRelease = selectedProject.releases.slice(-1)[0].minor;
    }

Но поток не нравится, жалуясь:

Cannot call selectedProject.releases.slice because property slice is missing in undefined [1].

     components/TimeEntries/EntryForm.jsx
     123│         release.major)));
     124│       projectHasNoReleases = false;
     125│       projectLatestMajorRelease = selectedProject.releases.slice(-1)[0].major;
     126│       projectLatestMinorRelease = selectedProject.releases.slice(-1)[0].minor;
     127│     }
     128│
     129│     const projectLatestRelease = `${projectLatestMajorRelease}.${projectLatestMinorRelease}`;

Что в мире мне не хватает? Я попытался добавить Array.isArray(selectedProject.releases), но поток все еще жаловался. Потоковые списки ошибок в обеих строках 125 и 126.

1 Ответ

0 голосов
/ 26 апреля 2018

Я бы сказал, что тот факт, что вы делаете какие-то потенциально эффективные вещи (запуск функции карты, создание набора и т. Д.), Заставляет Flow опасаться, что свойство releases могло измениться на объекте. Flow выполнит практически любые ваши уточнения после запуска функции.

Вот пример вашего кода, как есть, выдает ошибку

Самый простой способ обойти это - вытащить releases из вашего объекта в отдельное значение и выполнить нулевую проверку против этого. Таким образом, Flow уверен, что он все еще не равен нулю:

( Попробуйте )

// Mock this
type ReleaseType = {
  major: string;
  minor: string,
}

type ProjectType = {
  // removed for brevity
  releases?: Array<ReleaseType>
}

var selectedProject: ProjectType = {
  major: "foo",
  minor: "bar",
}

// Set up some variables for this example since I
// don't have any context on them
declare var majorReleasesSet: Set<any>;
declare var projectHasNoReleases: any;
declare var projectLatestMajorRelease: any;
declare var projectLatestMinorRelease: any;

// The `const {releases} = whateverObject` is the important part here
const {releases} = selectedProject || {};
if (releases && releases.length) {
  majorReleasesSet = new Set(releases.map((release: ReleaseType): string => (release.major)));
  projectHasNoReleases = false;
  projectLatestMajorRelease = releases.slice(-1)[0].major;
  projectLatestMinorRelease = releases.slice(-1)[0].minor;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...