redux和typescript问题-没有考虑我的if语句

tvz2xvvm  于 2023-03-31  发布在  TypeScript
关注(0)|答案(1)|浏览(114)

以下是我正在处理的实体的类型(时间轴为TimeLineElement[]

export type ProJectTimelineElement = {
  project: Project;
};

export type MissionTimelineElement = {
  mission: EntityDataState;
};

export type AvailabilityTimelineElement = {
  availabilities: Availability[];
};

export type TimelineElementData = {
  project?: Project;
  mission?: EntityDataState;
  availabilities?: Availability[];
};

export type TimelineElement = {
  date: string;
  elements: TimelineElementData[];
};

export type EntityState = {
  data: EntityDataState[];
  isLoading: boolean;
  error: boolean;
  timeline: TimelineElement[];
};

这里是我的reducer,我有类型问题(说即使在检查if语句之后它也是未定义的:

updateAvailabilities(state, action: PayloadAction<Availability>) {
      const timelineIndexToModify = state.timeline.findIndex(element => {
        const payloadDay = new Date(action.payload.start).getDate();
        const payloadMonth = new Date(action.payload.start).getMonth();
        const elementDay = new Date(element.date).getDate();
        const elementMonth = new Date(element.date).getMonth();
        return payloadDay === elementDay && payloadMonth === elementMonth;
      });

      if (state.timeline[timelineIndexToModify].elements.length === 0) {
        state.timeline[timelineIndexToModify].elements.push({
          availabilities: [{ ...action.payload }]
        });
      } else {
        const elementIndexToModify = state.timeline[
          timelineIndexToModify
        ].elements.findIndex(element => {
          if (element.availabilities) {
            return true;
          } else return false;
        });
        if (elementIndexToModify === -1) {
          state.timeline[timelineIndexToModify].elements.push({
            availabilities: [{ ...action.payload }]
          });
        } else if (
          state.timeline[timelineIndexToModify].elements[elementIndexToModify]
            .availabilities
        ) {
          const availabilityIndexToModify = state.timeline[
            timelineIndexToModify
          ].elements[elementIndexToModify].availabilities.findIndex(
            element => element.id === action.payload.id
          );
          state.timeline[timelineIndexToModify].elements[
            elementIndexToModify
          ].availabilities[availabilityIndexToModify] = action.payload;
        }
      }
    }

问题出在最后一条else if语句中,因为这条语句可能是未定义的,我检查它是否存在,但typescript并不关心这一点,并说它可能是未定义的。
我不知道该怎么办,任何帮助将不胜感激
typescript error in vscode

xwbd5t1u

xwbd5t1u1#

我已经遇到了同样的问题,并提出了疑问。你应该在使用之前将其分配给一个变量,如下所示。

const availabilities= state.timeline[timelineIndexToModify].elements[elementIndexToModify].availabilities

// Use this inside if statement
// Omitting...
else if (availabilities) {
      const availabilityIndexToModify = availabilities.findIndex(
        element => element.id === action.payload.id
      );
      availabilities[availabilityIndexToModify] = action.payload;
    }

My previous question here.

相关问题