我有一个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;
}