TypeScript为何不允许async函数返回Promise联合类型?
先看你定义的类型:
export interface Result<T> { data: T}; export type ErrorResult = Result<string>; export type ErrorResponse = Promise<ErrorResult>; export type SuccessResult = Result<any>; export type SuccessResponse = Promise<SuccessResult>;
你试图给async函数指定返回类型ErrorResponse | SuccessResponse(也就是Promise<ErrorResult> | Promise<SuccessResult>),但TypeScript不允许,只能写成Promise<ErrorResult | SuccessResult>,核心原因有两个:
async函数的本质决定了它只会返回单一Promise实例
async函数的运行逻辑是:不管你内部return的是同步值还是Promise,最终都会被自动包装成一个Promise实例返回。你不可能让一个async函数有时候返回Promise<ErrorResult>,有时候返回Promise<SuccessResult>——它从始至终只会返回一个Promise,只是这个Promise最终resolve的值可能是ErrorResult或者SuccessResult。所以正确的类型应该描述这个单一Promise的结果,也就是Promise<ErrorResult | SuccessResult>。TypeScript对async函数的返回类型有强制规范
TypeScript在类型检查时,会强制要求async函数的返回类型必须是Promise<X>的形式,而不是多个Promise类型的联合。Promise<A> | Promise<B>这种写法,在类型系统里描述的是“可能返回两种不同的Promise实例”,但这不符合async函数的实际行为,所以TypeScript会直接报错,要求你改成Promise<A | B>,也就是用Promise包裹联合类型,来准确描述“返回一个Promise,其结果是两种类型之一”。
内容的提问来源于stack exchange,提问作者samala7800

