网站搜索

如何在 Typescript 中管理未定义的返回类型?


抱歉,我是 Typescript 新手,需要在过滤后将 prop 传递给组件,为此我定义了一个简单的过滤方法。我遇到编译错误,提示 'Type 'IMilestone[] | undefined' is not assignable to type 'IMilestone[]'

 const milestonesOfActiveGroup = ():IMilestone[] => {
    return studyProgress?.groups.filter((group:IGroup) => group.name === activeGroup)[0].milestones
  }

由于我获取并填充了 studyProgress,它可能是未定义的,对吧?定义这个方法的正确方式是什么?

答案#1

你在 studyProgress 上使用了可选链,这意味着该变量可能是 null 或 undefined。用长形式来说,你的函数是这样做的:

const milestonesOfActiveGroup = (): IMilestone[] => {
  if (studyGroup) {
    return studyProgress.groups.filter(
      (group: IGroup) => group.name === activeGroup)[0].milestones
    )
  } else { 
    return undefined // this does not match the declared return type
  }
}

所以如果 studyGroup 不存在,你就无法深入访问它,而是返回 undefined。

要处理这种情况,你有几个选择。这里有两个。

允许函数返回 undefined

const milestonesOfActiveGroup = (): IMilestone[] | undefined => {

或者如果确实期望存在 studyProgress,而它不存在,则抛出错误,这应该被视为一个漏洞。

const milestonesOfActiveGroup = (): IMilestone[] => {
  if (!studyProgress) throw new Error("studyGroup has no value!")
  // typescript knows that studyProgress must exist from here on.
  return studyProgress.groups.filter((group:IGroup) => group.name === activeGroup)[0].milestones)
}

想一想当 studyProgress 没有设置值时意味着什么,以及你的程序在这种情况下应该做什么。然后处理这种情况,TypeScript 就会给你绿灯。

答案#2

const milestonesOfActiveGroup = (): IMilestone[] | undefined => {
    return studyProgress?.groups.filter((group:IGroup) => group.name === activeGroup)[0].milestones;
  }

你声明了“如果 studyProgress 是 undefined 或 null,则返回 undefined”(studyProgress?),所以你应该用 undefined 来声明返回类型(IMilestone[] | null)。| 是联合类型,表示“它将返回 IMilestone[] 或 undefined”。