TypeScript函数返回多个选项

时间:2019-01-30 17:27:27

标签: javascript typescript rxjs observable es6-promise

我有一个如下功能,我无法将其包裹住。函数如何返回多种类型,每种类型如何使用?

function(): Observable<Type> | Promise<Type> | Type {
...
}

似乎使用pipe(|)来指定可以返回多个值。我不明白的是什么时候使用?我怀疑发出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);
      }


}

与将其包装在Promise或Observable(用于订阅)中相比,是什么决定了是否按原样返回Type

2 个答案:

答案 0 :(得分:2)

在函数体内,您将决定何时返回哪种类型的结果。使用返回值时,您不直接知道结果的类型。因此,您可以cast结果:

function a(foo: string): string | boolean {
  if (foo) return true
  return "my string value"
}
const b = (a("") as boolean)
const c = (a("hello") as string)

在这种情况下,btypeof boolean,而cstring

答案 1 :(得分:0)

原因

无法确定在哪种情况下返回哪种类型。这是因为对TypeScript唯一重要的是,函数主体中返回的类型可以分配给其定义中使用的类型。

考虑这个愚蠢的例子:

function foo(): string | number | boolean {
    return 0;
}

在类型级别,此功能没有任何问题。世界上不可能返回string | boolean,但这没关系。重要的是0可分配给string | number | boolean

您可以做什么

您可以删除返回类型定义,然后查看推断的返回类型是什么。