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

TypeScript报错:Transaction无idbtrans属性但实际存在,如何调试?

问题:Dexie Transaction.idbtrans 类型报错

报错信息

访问tx.idbtrans时触发TypeScript类型错误:

Error: Property 'idbtrans' does not exist on type 'Transaction & { fileInfo: EntityTable<FileInfo, "id">; }'. 
        await db.transaction("rw", x.myUndoTransactionsToApply.tables.flat(), async (tx) => {
          wmNormalUndoOrRedo.set(tx.idbtrans, 2); // 2表示处于重做操作
          if(x && x.myUndoTransactionsToApply) 

问题确认

无论是查阅Dexie官方文档,还是本地通过npm link关联的源码,都能确认idbtrans属性存在于Transaction类中:

// src/classes/transaction/transaction.ts
/** Transaction
 * 
 * https://dexie.org/docs/Transaction/Transaction
 * 
 **/
export class Transaction implements ITransaction {
…
  idbtrans: IDBTransaction;
…

调试与解决建议

1. 查看Transaction的完整类型定义

  • 在VSCode中按住Ctrl(Windows)/Cmd(Mac)点击Transaction类型,直接跳转至项目依赖的类型声明文件(.d.ts),检查是否包含idbtrans属性。
  • 执行tsc --noEmit --declaration生成类型声明文件,在输出的.d.ts中搜索Transaction类的完整定义。
  • 在代码中添加临时类型检查代码,将鼠标悬停在TransactionKeys上查看所有允许的属性:
    type TransactionKeys = keyof typeof tx;
    

2. 检查依赖版本一致性

  • 执行npm list dexie查看项目依赖的Dexie版本,与本地npm link的源码版本号对比,确认二者一致。
  • 若项目使用了@types/dexie,检查其版本是否与Dexie核心版本匹配,旧类型包可能未包含idbtrans定义。

3. 验证运行时属性是否存在

在代码中添加运行时日志,确认tx实例实际拥有idbtrans属性:

await db.transaction("rw", tables, async (tx) => {
  console.log("tx实例属性:", Object.keys(tx));
  console.log("idbtrans是否存在:", 'idbtrans' in tx);
  // 临时绕过类型检查验证功能
  wmNormalUndoOrRedo.set((tx as any).idbtrans, 2);
});

4. 修复类型不匹配问题

  • 若类型文件缺失idbtrans,可在项目的类型声明文件中手动补充:
    declare module 'dexie' {
      interface Transaction {
        idbtrans: IDBTransaction;
      }
    }
    
  • 重新执行npm link dexie,确保本地源码的类型文件同步到项目中。
  • 删除项目根目录的.tsbuildinfo文件,或重启VSCode重新加载类型缓存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:02:13