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
相关产品推荐
相关产品推荐

