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

TypeScript中以类型参数作为泛型的实现方案问询

解决TypeScript中DatabaseEngine接口的高阶泛型问题

你遇到的是TypeScript当前不支持高阶泛型类型参数的问题(对应特性请求#1213),即无法将接口的类型参数ResultType当作泛型类型来使用(如ResultType<T>)。以下是两种实用的替代实现方案:

方案一:通过工具类型提取行类型

这种方案核心是从传入的结果包装器实例中自动提取行类型T,无需依赖高阶泛型,兼容所有数据库驱动的结果结构。

实现代码

// 工具类型:从结果包装器中提取行类型(可根据不同数据库驱动扩展判断逻辑)
type ExtractRowType<Result> = 
  Result extends { recordset: infer Row[] } ? Row :  // 适配mssql的IResult结构
  Result extends { rows: infer Row[] } ? Row :      // 适配MySQL等驱动的结构
  never;

// 定义通用的DatabaseEngine接口
interface DatabaseEngine<ResultTemplate> {
  toDataFrame<Result extends ResultTemplate>(result: Result): DataFrame<ExtractRowType<Result>>;
}

使用示例

import mssql from 'mssql';

// 针对MSSQL实现引擎
const msSqlDatabaseEngine: DatabaseEngine<mssql.IResult<unknown>> = {
  toDataFrame(result) {
    // 自动推断result的行类型,处理后返回DataFrame
    return new DataFrame(result.recordset);
  }
};

// 实际调用
const queryResult = await mssql.connect({ /* 配置 */ }).query<Employee>('SELECT * FROM Employees');
const df = msSqlDatabaseEngine.toDataFrame(queryResult); 
// 编译器自动推断df类型为DataFrame<Employee>

方案二:约束ResultType为泛型接口

如果所有数据库驱动的结果包装器都遵循统一的泛型接口规范,可以直接对ResultType进行泛型约束,明确它是一个接受行类型参数的泛型类型。

实现代码

// 定义通用的泛型结果包装器约束
interface GenericResult<T> {
  affectedRows: number;
  // 其他通用元数据字段
}

// 定义DatabaseEngine,约束ResultType为泛型接口
interface DatabaseEngine<ResultType extends GenericResult<any>> {
  toDataFrame<T>(result: GenericResult<T>): DataFrame<T>;
}

使用示例

import mssql from 'mssql';

// MSSQL的IResult符合GenericResult<T>规范,直接使用
const msSqlDatabaseEngine: DatabaseEngine<mssql.IResult<any>> = {
  toDataFrame<T>(result: mssql.IResult<T>): DataFrame<T> {
    return new DataFrame(result.recordset);
  }
};

// 调用方式同方案一,自动推断行类型
const queryResult = await mssql.connect({ /* 配置 */ }).query<Employee>('SELECT * FROM Employees');
const df = msSqlDatabaseEngine.toDataFrame(queryResult);

方案对比

  • 方案一:灵活性更高,无需依赖数据库驱动的泛型接口规范,只需调整ExtractRowType适配不同结果结构。
  • 方案二:类型约束更严格,适合所有数据库驱动都遵循统一泛型结构的场景,代码可读性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:40:33