【问题标题】:How to deal with union type that has undefined in it?如何处理其中未定义的联合类型?
【发布时间】:2018-05-16 09:57:32
【问题描述】:

我有这个函数用来返回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&lt;User&gt; 的类。


这是我正在使用的另一个与这个非常相似的函数:

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 Code 中将用户视为User。不像User | undefined 这正是我想要的第一个函数。

【问题讨论】:

  • 你使用的是什么版本的 TypeScript?这应该在最新版本中正常工作。
  • 2.6.1 在 VSCode 中。
  • 顺便说一句,这不是对您的代码的改进,您只会让它变得更复杂而没有实现任何目标。如果你看一下函数式编程——比如 monad,你会返回一个相同的容器结构,其中可能有一个值或没有,但你的代码不在乎,没有“ifs”来检查是否有是一个值,无论如何,您都可以链接操作。现在,而不是undefined,您检查其他内容 - 没有净收益。 NotFoundResponseDto thingy 中甚至没有任何其他信息。还不如保留undefined
  • 我尝试了启用了 strictNullChecks 选项的代码。这对我来说可以。你能发布一个完整的样本来重现你的问题吗?还要确保编译器实际上是 2.6.1。
  • 您可以在UserService 中抛出NotFoundException 而不是NotFoundResponseDto,然后使用Exception Filter 捕获该异常。这样你的代码会更干净——你只需要处理控制器中的工作逻辑。

标签: typescript types undefined nestjs


【解决方案1】:

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

  1. 如果 getOne() 抛出错误,并且未被捕获,则 findOne 将返回 undefined。
  2. 如果 getOne() 可能返回 undefined,findOne 可能返回 undefined。

基本上,检查 userService.getOne() 以查看它的返回类型(可能显式声明它),那么你应该很高兴。

【讨论】:

    猜你喜欢
    • 2022-11-30
    • 2011-03-31
    • 2020-06-30
    • 2019-12-07
    • 1970-01-01
    • 2022-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多