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

如何为pg-mem库的方法参数及返回值指定准确TypeScript类型

为pg-mem的createTypeormConnection补充明确类型的方案

方法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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:01:18