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

TypeScript如何定义适配任意BaseModel子类的通用Query数组类型

解决方案

方案1:使用类型推断辅助函数(推荐)

不需要手动写类型注解和类型断言,通过工具函数自动推导每个Query对象的正确类型:

class BaseModel {
    baseProperty: any;
}

class AModel extends BaseModel {
    aProperty: any;
}

class BModel extends BaseModel {
    bProperty: any;
}

// 先定义基础约束
type ModelConstructor = new (...args: any[]) => BaseModel
type Query<T extends ModelConstructor> = {
    model: T,
    filter: Partial<InstanceType<T>>;
}

// 定义辅助创建查询数组的工具函数
function defineQueries<T extends ModelConstructor[]>(queries: [...{ [K in keyof T]: Query<T[K]> }]) {
    return queries
}

// 直接使用,无类型报错
const queries = defineQueries([
    {
        model: AModel,
        filter: {aProperty: 0}
    },
    {
        model: BModel,
        filter: {bProperty: false}
    }
])

这种方案的优势是后续新增任意BaseModel子类,不需要修改任何类型定义,自动适配新类的属性校验。

方案2:定义通用查询类型

如果需要手动给queries标注类型,可以定义适配任意子类的通用Query类型:

type AnyQuery = {
    [T in ModelConstructor]: {
        model: T,
        filter: Partial<InstanceType<T>>
    }
}[ModelConstructor]

// 直接标注类型即可
const queries: AnyQuery[] = [
    {
        model: AModel,
        filter: {aProperty: 0}
    },
    {
        model: BModel,
        filter: {bProperty: false}
    }
]

原写法报错原因

你之前定义Query<typeof BaseModel>[]时,相当于把所有Query对象的泛型参数固定为了BaseModel的构造函数,推导出来的filter类型就是Partial<BaseModel>,自然无法识别子类独有的属性。

内容的提问来源于stack exchange,提问作者lemon-lord

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:15:03