首页 > 解决方案 > 有没有办法在打字稿中对具有可为空属性的数组进行排序?

问题描述

这是我的代码:

export function getExpertTitle(
  experiences: Array<{
    title?: string | null;
    description?: string | null;
    endDate?: Date | null;
  }> | null
) {
  const emptyExperience = {
    title: null,
    description: null,
    endDate: null
  };

  let currentExperience = experiences && experiences[0];
  
  // Here is were i start to have the error
  // Object is possibly 'null' or 'undefined'.ts(2533)  

  for (let i = 0, l = experiences && experiences.length; i < (!isNullOrUndefined(l) && l); i++) {
    if (isNullOrUndefined(experiences && experiences[i].endDate)) {
      currentExperience = experiences && experiences[i];
    } else if ((!isNullOrUndefined(currentExperience) && currentExperience.endDate.getTime()) > Date.now()) {
      currentExperience = experiences && experiences[i];
    }
  }

所以,我想做的是比较体验数组并使用endDate属性按日期对它们进行排序,并且我想将currentExperience设置为最新体验。此外,如果endDate属性为“null”,则体验仍在进行中,默认情况下使其成为currentExperience

我在想for循环可能看起来像这样,但我仍然收到错误:

  for (let i = 0, l = experiences.length; i < l; i++) {
    if (isNullOrUndefined(experiences[i].endDate)){
      currentExperience = experiences && experiences[i];
      break;
    }
    else if (experiences[i].endDate?.getTime() > currentExperience.endDate.getTime()) {
      currentExperience = experiences && experiences[i];
    }
  }

我还在努力解决这个问题,如果我得到解决方案,我会发布它。同时,任何评论将不胜感激。

标签: arraystypescriptsortingnull

解决方案


此错误的原因是您对数组的类型定义说任何条目都可能为空:

experiences: Array<{
    title?: string | null;
    description?: string | null;
    endDate?: Date | null;
  }> | null // <------------------ HERE

要过滤掉这些null值,您可以使用类似

experiences.filter(x => x !== null) as Array<{
  title?: string | null;
  description?: string | null;
  endDate?: Date | null; }> // array cannot contain null, only objects with null properties

但从你的代码正在做的事情来看,我认为你会在你的 for 循环中更喜欢这样的东西:

  for (let i = 0, l = experiences.length; i < l; i++) {
    // below is now true if the object is null
    if (isNullOrUndefined(experiences && experiences[i] && experiences[i].endDate)){
      currentExperience = experiences && experiences[i];
      break;
    }
    // ...
  }

推荐阅读