TypeScript中Promise<void>无法赋值给Promise<transactionArgument>报错排查
问题:TypeScript事务处理函数返回类型不匹配编译错误
我在TypeScript中编写了事务处理代码,出现编译错误:Type 'Promise<void>' is not assignable to type 'Promise<transactionArgument>'。我认为函数已经返回了类型为transactionArgument的transaction变量,想请教报错原因。
代码示例
type RegisterPricingTransactionInfo = (pricingTransaction: transactionArgument, createdAt: Date, createdBy: string, datasource: any) => Promise<transactionArgument> export const registerPricingTransactionInfo: RegisterPricingTransactionInfo = async (pricingTransaction, createdAt, createdBy, datasource) => { let urlCode; let transaction: transactionArgument; transaction = { test: "test" } await datasource.manager.transaction(async (transactionalEntityManager: EntityManager) => { try { await transactionalEntityManager.save(transaction) return transaction; } catch (error) { console.error(error) } }) }
错误信息
"message": "Type '(pricingTransaction: transactionArgument, createdAt: Date, createdBy: string, datasource: any) => Promise<void>' is not assignable to type 'RegisterPricingTransactionInfo'. Type 'Promise<void>' is not assignable to type 'Promise<transactionArgument>'. Type 'void' is not assignable to type 'transactionArgument'.",
报错原因与修复方案
核心原因
你外层的registerPricingTransactionInfo函数没有返回任何值:虽然你在transaction的回调函数里返回了transaction,但这个返回值属于回调函数本身,不会自动成为外层函数的返回值。外层函数执行完await datasource.manager.transaction(...)后就直接结束,没有明确的返回语句,所以TypeScript推断它的返回类型是Promise<void>,和你定义的Promise<transactionArgument>类型不匹配。
另外,即使回调里有返回值,如果catch分支没有处理返回值或抛出错误,回调函数的返回类型会变成Promise<void>,同样会导致外层类型不匹配。
修复后的代码
type RegisterPricingTransactionInfo = (pricingTransaction: transactionArgument, createdAt: Date, createdBy: string, datasource: any) => Promise<transactionArgument> export const registerPricingTransactionInfo: RegisterPricingTransactionInfo = async (pricingTransaction, createdAt, createdBy, datasource) => { let transaction: transactionArgument = { test: "test" }; // 接收回调的返回值,并作为外层函数的返回值 return await datasource.manager.transaction(async (transactionalEntityManager: EntityManager) => { try { await transactionalEntityManager.save(transaction); return transaction; } catch (error) { console.error(error); // 重新抛出错误,让外层Promise进入reject状态,符合类型要求 throw error; } }); }
关键修复点
- 在外层函数中添加
return,将transaction方法的执行结果(即回调的返回值)作为外层函数的返回值。 - 在catch分支中重新抛出错误:如果只捕获错误不处理,回调函数会返回
Promise<void>,外层函数即使return了这个结果,类型依然不匹配。重新抛出错误后,外层Promise会被标记为reject,符合Promise<transactionArgument>的类型定义(Promise要么resolve为transactionArgument,要么reject)。
内容的提问来源于stack exchange,提问作者Heisenberg
相关产品推荐
相关产品推荐

