【问题标题】:TypeScript function returns multiple optionsTypeScript 函数返回多个选项
【发布时间】: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&lt;T&gt; 等。这就是为什么 Bergi 指出这通常是一个坏主意(这意味着您实际上不能信任返回类型值那么多)。在这种情况下,这意味着任何使用 CanActivate/CanActivateChild 必须的编码方式必须考虑到这种差异。
  • 哦,有趣!感谢您的跟进!有什么方法可以确定函数是如何被调用的,以便可以返回适当的返回值?例如,我可以判断调用者是否想要一个承诺而不是价值?

标签: javascript typescript rxjs observable es6-promise


【解决方案1】:

原因

没有办法知道在哪种情况下返回哪种类型。这是因为对 TypeScript 来说唯一重要的是函数体中返回的类型可以分配给其定义中使用的类型。

考虑这个愚蠢的例子:

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

在类型层面上,这个函数没有任何问题。世界上没有办法返回string | boolean,但这没关系。重要的是0 可以分配给string | number | boolean

你能做什么

你可以删除返回类型定义,看看推断的返回类型是什么。

【讨论】:

  • 可怕! 0、true、“true”和“0”都是true,太像PERL了。
【解决方案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)

在这种情况下,b 将是 typeof boolean,而 cstring

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多