【发布时间】:2019-06-24 01:35:45
【问题描述】:
我有一个如下功能,我无法理解它。一个函数如何返回多个类型,每个类型如何使用?
function(): Observable<Type> | Promise<Type> | Type {
...
}
看起来管道(|)用于指定可以返回多个值。我不明白的是每个人什么时候使用?我怀疑发出subscribe时使用Observable,默认使用Promise,使用await调用函数时使用直上Type。
如果我是对的,那就太好了!我似乎无法找到有关此功能的文档,以便了解更多信息。你能帮我吗?我怀疑我的问题是我不知道 Google 搜索什么。
更新:附加代码示例
以下是提供了多种返回类型的代码示例,但我只返回布尔类型。
@Injectable()
export class AuthGuard implements CanActivate, CanActivateChild {
constructor(private authService: AuthService, private router: Router) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) :
Observable<boolean> | Promise<boolean> | boolean {
return this.authService.isAuthenticated()
.then((authenticated: boolean) => {
if (authenticated) {
return true;
} else {
this.router.navigate(['/']);
}
});
}
canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) :
Observable<boolean> | Promise<boolean> | boolean {
return this.canActivate(route, state);
}
}
是什么决定了是否按原样返回 Type,而不是将其包装在 Promise 或 Observable 中(用于订阅)?
【问题讨论】:
-
它有一种返回类型,但该返回类型是 union 的 3 种其他类型,例如
string | number类型描述的值范围包括"foo"和123等值。 -
这是一个非常糟糕的主意。该函数应该总是返回一个 promise 或者总是返回一个 observable(取决于你需要什么)。
-
感谢@p.s.w.g 的链接!我通读了工会文档,终于可以看到一些正在发生的事情。我没有得到的是,在上面显示的签名中,我可以返回
Type类型,并且在async函数或subscribed 中调用时,它会神奇地使其成为 Observable 或 Promise到。这让我相信 Typescript 或 Javascript 中发生了一些魔法来包装返回的变量。我将使用另一个代码示例更新我的问题。 -
@BK- 不,它不会神奇地使它可观察到。这意味着调用此函数的任何代码都必须对其返回值运行类型检查,以确保它实际上是
Observable<T>等。这就是为什么 Bergi 指出这通常是一个坏主意(这意味着您实际上不能信任返回类型值那么多)。在这种情况下,这意味着任何使用CanActivate/CanActivateChild必须的编码方式必须考虑到这种差异。 -
哦,有趣!感谢您的跟进!有什么方法可以确定函数是如何被调用的,以便可以返回适当的返回值?例如,我可以判断调用者是否想要一个承诺而不是价值?
标签: javascript typescript rxjs observable es6-promise