如何为pg-mem库的方法参数及返回值指定准确TypeScript类型
方法1:模块类型扩充(全局生效,推荐)
在项目中新建一个.d.ts类型声明文件(例如src/types/pg-mem.d.ts),通过TypeScript的模块补充特性,覆盖pg-mem默认导出的接口定义,把any替换为TypeORM对应的官方类型:
import type { DataSource, DataSourceOptions } from 'typeorm'; declare module 'pg-mem' { export interface LibAdapters { createTypeormConnection( typeOrmConnection: DataSourceOptions, queryLatency?: number ): Promise<DataSource>; } }
*如果你使用的是0.2.x及更早版本的TypeORM,将DataSource替换为Connection、DataSourceOptions替换为ConnectionOptions即可,旧版TypeORM使用Connection作为连接实例类型。
这个方案不需要修改任何业务调用代码,全局所有调用createTypeormConnection的位置都会自动获得正确的类型校验,从根源上消除no-unsafe-return类的lint报错。
方法2:调用处类型断言(适合单次临时使用)
如果仅在少数测试用例中用到该方法,不想维护全局类型声明,可以在调用时直接通过TypeScript类型语法明确入参和返回值类型:
import { DataSource, type DataSourceOptions } from 'typeorm'; import { newDb } from 'pg-mem'; const memDb = newDb(); // 用satisfies校验入参结构,用类型断言明确返回值类型 const connection: DataSource = await memDb.adapters.createTypeormConnection({ type: 'postgres', entities: [/*你的业务实体类*/], synchronize: true, } satisfies DataSourceOptions) as DataSource;
satisfies是TypeScript 4.9+支持的语法,会自动校验入参符合DataSourceOptions的结构要求,比直接传参加as的类型安全性更高。
方法3:封装带类型的工具函数(适合多场景复用)
如果项目中多处需要创建pg-mem的TypeORM连接,可以封装一层带明确类型的工具函数,统一收口调用逻辑,避免any类型向外泄露:
import { newDb, type LibAdapters } from 'pg-mem'; import { DataSource, type DataSourceOptions } from 'typeorm'; // 基于原有LibAdapters类型,替换createTypeormConnection的类型定义 type TypedLibAdapters = Omit<LibAdapters, 'createTypeormConnection'> & { createTypeormConnection( options: DataSourceOptions, queryLatency?: number ): Promise<DataSource>; }; export async function createInMemoryPgConnection( connOptions: DataSourceOptions, queryLatency?: number ): Promise<DataSource> { const db = newDb(); const adapters = db.adapters as TypedLibAdapters; return adapters.createTypeormConnection(connOptions, queryLatency); }
后续所有需要创建内存数据库连接的位置,都直接导入这个封装好的函数即可,类型完全可控。
注意:pg-mem对TypeORM连接实例是模拟实现,并不会100%覆盖真实DataSource/Connection的所有API,如果实际使用中遇到部分方法不存在的情况,可以根据自己用到的API自定义更精简的返回类型,或者用
Pick<DataSource, '你用到的方法名'>来定义返回值,避免类型和实际运行逻辑不符。
内容的提问来源于stack exchange,提问作者razortech

