为什么FlowType认为我的变量不确定



我有一个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上的错误。

我会说,您做一些潜在有效的事情(运行地图功能,制作集合等(的事实使流程担心releases属性可能已经在对象上发生了变化。运行功能后,流程将基本上丢弃您的任何细化。

以下是您的代码的一个示例

解决此问题的最简单方法是将releases从您的对象中拉出单独的值并对其进行零检查。这样,流可以确定它仍然不是零:

(try(

// 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;
}

最新更新