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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:18:03