如何用TypeScript类型化带include参数的Sequelize findAll方法
解决方案
方案1:显式声明关联属性+兼容类型断言
首先需要在Offer类中声明关联对应的属性,让TypeScript认可Offer实例存在rules字段,这样就不需要经过unknown做强制类型转换:
import { Model, Optional } from 'sequelize'; import Rule from './rule'; interface OfferAttributes { id: number; name: string; } type OfferCreationAttributes = Optional<OfferAttributes, 'id'>; export class Offer extends Model<OfferAttributes, OfferCreationAttributes> implements OfferAttributes { public readonly id!: number; public name!: string; // 新增关联属性声明,因为仅关联查询时会加载,所以定义为可选 public rules?: Rule[]; public static getWithRules() { // 此处类型断言符合TS类型兼容规则,不属于非法强转 return Offer.findAll({ include: ['rules'] }) as Promise<Array<Offer & { rules: Rule[] }>>; } }
方案2:使用Sequelize官方泛型工具(v6.14.0+支持)
如果希望完全通过泛型推导实现、不写任何类型断言,可以使用Sequelize内置的工具类型自动推导带关联的返回结果:
import { Model, Optional, FindOptions, InferIncludeModelAttributes } from 'sequelize'; import Rule from './rule'; interface OfferAttributes { id: number; name: string; } type OfferCreationAttributes = Optional<OfferAttributes, 'id'>; // 定义Offer的关联映射,可全局复用 interface OfferAssociations { rules: Rule; } export class Offer extends Model<OfferAttributes, OfferCreationAttributes> implements OfferAttributes { public readonly id!: number; public name!: string; public rules?: Rule[]; // 声明类的关联类型 public static associations: OfferAssociations; public static getWithRules() { const options: FindOptions<OfferAttributes> = { include: ['rules'] }; // 泛型自动推导包含关联属性的实例类型 return Offer.findAll< Offer & InferIncludeModelAttributes<Offer, typeof options.include> >(options); } }
内容的提问来源于stack exchange,提问作者Den Rupp
相关产品推荐
相关产品推荐

