空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




