You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
        }
    });
}

关键修复点

  1. 在外层函数中添加return,将transaction方法的执行结果(即回调的返回值)作为外层函数的返回值。
  2. 在catch分支中重新抛出错误:如果只捕获错误不处理,回调函数会返回Promise<void>,外层函数即使return了这个结果,类型依然不匹配。重新抛出错误后,外层Promise会被标记为reject,符合Promise<transactionArgument>的类型定义(Promise要么resolve为transactionArgument,要么reject)。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 09:15:29