TypeScript使用pg-promise为何无法直接导入TransactionMode与isolationLevel?
在TypeScript中使用pg-promise时直接导入TransactionMode和isolationLevel出现undefined的问题
核心原因:pg-promise的设计模式
pg-promise采用工厂函数模式,你调用pgPromise()创建的是一个数据库连接实例,而TransactionMode和isolationLevel并不是库的顶级导出成员——它们是挂载在实例的txMode属性下的运行时对象。
虽然TypeScript的类型定义文件(.d.ts)里可能把这些成员列为可导入的类型,但那只是给编译阶段做类型检查用的,运行时这些顶级导出的变量并不存在,所以你直接导入会拿到undefined。
为什么从pgp.txMode获取可行?
当你调用pgPromise()创建实例后,实例内部会初始化txMode模块,把TransactionMode构造函数和isolationLevel枚举挂载到这个属性上,这才是它们真正的运行时存在位置。
能不能直接导入使用?
按照pg-promise的官方设计,你没办法直接从库的顶级导出中拿到可用的TransactionMode和isolationLevel运行时实例。类型定义里的导出只是为了让你在TypeScript中做类型注解时能引用到它们的类型,但运行时必须从实例的txMode属性获取。
如果觉得每次写pgp.txMode.xxx麻烦,可以提前解构赋值简化代码:
import pgPromise from "pg-promise"; const pgp = pgPromise(); const { TransactionMode, isolationLevel } = pgp.txMode; // 后续正常使用 const mode = new TransactionMode({ tiLevel: isolationLevel.serializable });
内容的提问来源于stack exchange,提问作者sw1337
相关产品推荐
相关产品推荐

