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

