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

TypeScript编译器推断的ORM方法返回类型与实际类型不符如何解决

类型推断异常原因
  • 基类TestModel声明findById静态方法时未做泛型绑定,TypeScript默认按方法声明时的上下文推断返回类型:new this在基类的声明上下文中,只会被判定为TestModel的实例。
  • 静态方法的this类型默认指向声明方法的类本身,不会跟随子类调用场景自动动态推导,所以子类调用继承的静态方法时,TypeScript仍然沿用基类定义的返回类型。
修复方案

给基类的findById静态方法增加泛型约束,将返回类型和调用方的子类实例类型绑定,修改后的代码如下:

// model.ts
import { Pool, QueryResult } from 'pg';

// 可根据实际场景调整pool初始化逻辑
const pool = new Pool();

export class TestModel {
  static tableName: string;
  constructor(data: any) {}

  // 新增泛型约束:T为继承TestModel的子类实例类型,this约束为子类的构造函数
  public static async findById<T extends TestModel>(
    this: { new(...args: any[]): T, tableName: string },
    id: number
  ): Promise<T | null> {
    const client = await pool.connect();
    // 原写法直接拼接参数存在SQL注入风险,已调整为参数化查询
    const result: QueryResult<any> = await client.query(
      `select * from public."${this.tableName}" where id = $1`,
      [id]
    );
    const results = result ? result.rows : null;
    client.release();
    if (!results) return null;
    return new this(results[0]);
  }
}

export class TestWeekModel extends TestModel {
  static tableName = 'Week';
  id: any;
  current_week: any;
  
  constructor(data: any) {
    super(data);
    this.id = data.id;
    this.current_week = data.current_week;
  }
}

修改后调用TestWeekModel.findById(1)时,TypeScript会自动推断返回值类型为TestWeekModel | null,和实际运行结果的类型完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:42:01