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

使用Prisma ORM实现交互式事务时遇类型错误求助

解决Prisma交互式事务类型错误:Argument of type '(tx: any) => Promise' is not assignable to parameter of type 'PrismaPromise[]'

错误原因分析

这个报错的核心是TypeScript无法识别你传入的异步回调函数为交互式事务的合法参数,本质是Prisma Client的交互式事务类型定义未正确生成,通常由版本兼容、生成缓存或TS配置问题导致。

解决方案

1. 升级Prisma到兼容版本

交互式事务的类型定义在Prisma v3.10.0及以上版本才正式支持。先检查当前版本:

npm list prisma

若版本低于v3.10.0,执行升级:

npm install prisma@latest @prisma/client@latest

2. 强制重新生成Prisma Client

修改previewFeatures后可能存在缓存残留,导致类型定义未更新,执行以下步骤重置:

# 删除旧的客户端文件
rm -rf node_modules/@prisma/client
# 重新生成客户端
npx prisma generate

3. 检查TypeScript配置

确保tsconfig.json开启严格类型检查,至少启用strictFunctionTypes:

{
  "compilerOptions": {
    "strict": true,
    // 或单独开启:
    "strictFunctionTypes": true
  }
}

4. 手动指定事务客户端类型(兜底方案)

若以上方法无效,手动给回调中的事务客户端指定类型,避免any引发的类型不匹配:

import { PrismaClient } from '@prisma/client';

const client = new PrismaClient();

class Transfer {
  static async transfer(transaction: Transcation) {
    return await client.$transaction(async (ts: PrismaClient) => {
      const sender = await ts.account.update({
        data: {
          balance: {
            decrement: transaction.value
          }
        },
        where: {
          id: transaction.debitedAccountId
        }
      });

      const recipient = await ts.account.update({
        data: {
          balance: {
            increment: transaction.value
          }
        },
        where: {
          id: transaction.creditedAccountId
        }
      });

      validateBalanceToTransaction(sender.balance);
      validateTransactionDestination(sender.id, recipient.id);
      return recipient;
    });
  }
}

额外注意事项

  • 确认schema.prisma无语法错误,否则prisma generate会静默失败,导致类型定义未更新
  • 若使用monorepo,需确保Prisma Client在子项目中正确安装和生成

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:01:09