是否需要将空的Promise拒绝明确地键入VOID?

时间:2019-11-29 10:38:09

标签: typescript promise

承诺拒绝默认情况下返回类型 void

  

Promise.reject(reason ?: any)=>无效

比方说,我们有一个getUser函数,该函数返回一个User对象,以传递给例如登录函数。因此,我们使用Promise来解决发现用户的问题,并在找不到用户或发生错误时拒绝。

// getUser returns an object or void
getUser(): Promise<object|void> {
  return new Promise((resolve, reject) => {
    // user is found
    resolve({ user: user });
    // user is not found or error
    reject();
  });
}

login(): void {
  this.getUser()
    .then((result: object) => {
      // get user here to send back
      this.res.status(200).json({
        user: result['user']
      });
    })
    .catch(() => {
      // don't need to receive data here
      this.res.status(500).json({
        error: 'No login'
      });
    });
}

是否有必要在函数返回类型中将返回类型明确指定为 VOID

getUser(): Promise<object|void>

还是仅将返回类型设置为object就足够了吗?

getUser(): Promise<object>

1 个答案:

答案 0 :(得分:1)

通用Promise<T>的type参数是用于解析 Promise的类型。因此,在这种情况下,Promise<object>是正确的(对于某些Promise<User>类型,甚至是更好的User)。

使用Promise<object | void>是错误的,因为Promise永远不会以void进行解析。

Typescript实际上并不跟踪用于拒绝 Promise的值的类型。这是因为Promise不仅会在您调用reject()时拒绝,而且还会抛出异常,并且不会尝试跟踪异常的类型。

我要对您的代码进行的唯一其他更改是停止使用object并明确说明该接口:

interface User { user: string }; // Or whatever it really is

getUser(): Promise<User> {
  return new Promise((resolve, reject) => {
    // user is found
    resolve({ user: user });
    // user is not found or error
    reject();
  });
}

login(): void {
  this.getUser()
    .then((result: User) => {
      // get user here to send back
      this.res.status(200).json({
        user: result['user']
      });
    })
    .catch(() => {
      // don't need to receive data here
      this.res.status(500).json({
        error: 'No login'
      });
    });
}