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