如何处理未定义的联合类型?

时间:2017-12-02 12:27:25

标签: typescript types undefined nestjs

我有这个用来返回UserResponseDto | undefined的函数。现在我想重构它,所以我将返回UserResponseDto | NotFoundDto。函数this.userService.findOne()正在返回Promise<User | undefined>

目前我有这个:

async findOne (@Param() params): Promise<UserResponseDto | undefined> {
  return this.userService.findOne(params.id)
}

我想要这样的事情:

async findOne (@Param() params): Promise<UserResponseDto | NotFoundResponseDto> {
  const user = await this.userService.findOne(params.id)
  if (typeof user === "undefined") {
    return new NotFoundResponseDto()
  }

  return new UserResponseDto(user) // 1
}

但遗憾的是,我似乎无法摆脱undefined部分中的User | undefined。在// 1中,user仍被视为User | undefined。我应该使用user as User吗?我觉得这是一个讨厌的解决方法。

我错过了什么吗?没有大量的样板代码,它可以更轻松地完成吗?

UserResponseDto是一个在构造函数user: User中接受1个参数并扩展SingleResponse<User>的类。

这是我正在使用的另一个与此非常相似的功能:

async update (@Param() params, @Body() dto: UpdateUserRequestDto): Promise<User | undefined> {
  const user = await this.userService.update(params.id, dto)
  if (typeof user === 'undefined') {
    return undefined
  }

  return this.userService.findOne(user.id) // 2
}

此处我尚未将User更改为UserResponseDto,而在// 2中VS代码将用户视为User。不是User | undefined,这正是我想要的第一个函数。

1 个答案:

答案 0 :(得分:0)

userService.getOne可能是你的问题。以下是一些常见问题:

  1. 如果getOne()抛出错误,并且未被捕获,则findOne将返回undefined。
  2. 如果getOne()可能返回undefined,则findOne可能会返回undefined。
  3. 基本上,检查userService.getOne()以查看它的返回类型(可能是明确声明它),那么你应该好好去。