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
相关产品推荐
相关产品推荐

