You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

空Promise拒绝是否需显式声明VOID类型?Promise返回类型疑问

回答

Great question! Let's break this down clearly for you:

核心结论

不需要getUser的返回类型中显式指定|void,直接声明为getUser(): Promise<object>就完全足够,甚至可以更精准地定义一个自定义类型(比如UserResponse接口)来替代object,让类型检查更严格。

原因分析

在TypeScript中,Promise<T>的泛型参数T仅代表该Promise成功resolve时返回的值的类型,和reject的参数类型没有关联:

  • 当你调用resolve({ user: user })时,明确返回了一个object类型的值,这正好对应Promise<object>中的object
  • reject()的情况属于异步错误分支,会被.catch()捕获,TypeScript不会把reject的参数类型纳入Promise<T>的泛型定义中(默认情况下reject的参数类型是any,你也可以通过Promise<T, E>显式指定,但日常开发中很少这么做)。

如果强行在泛型中加入|void,虽然不会导致代码报错,但完全没有必要——因为你的getUser永远不会通过resolve()返回void类型的值,这个void在这里没有实际的语义意义。

代码优化示例

调整后的更严谨写法如下:

// 先定义精准的类型,替代模糊的object
interface User {
  // 这里可以定义用户的具体字段,比如id、name等
}

interface UserResponse {
  user: User;
}

getUser(): Promise<UserResponse> {
  return new Promise((resolve, reject) => {
    // 用户存在时resolve
    resolve({ user: user });
    // 用户不存在或出错时reject
    reject();
  });
}

login(): void {
  this.getUser()
    .then((result: UserResponse) => {
      this.res.status(200).json({ user: result.user });
    })
    .catch(() => {
      this.res.status(500).json({ error: 'No login' });
    });
}

这样的类型声明既准确反映了getUser成功时的返回值,也不会干扰错误分支的处理逻辑。

内容的提问来源于stack exchange,提问作者Tomas Vancoillie

火山引擎 最新活动