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

TypeScript使用Sequelize时如何设置参数类型解决TS2684错误

TS项目Sequelize模型关联函数类型报错修复

问题场景

开发时编写通用双向一对一关联函数,给第一个入参标注typeof Model类型时触发TS2684报错,相关代码如下:

import { Model, DataTypes } from 'sequelize';

interface IExtracciones {
  id_extraccion: Number | null | undefined;
  monto_extraido: Number;
  fecha_de_extraccion: Date;
  numero_de_cuenta: Number;
}

export default class Extracciones extends Model<IExtracciones> {}

Extracciones.init(
  {
    id_extraccion: {
      type: DataTypes.INTEGER,
      primaryKey: true,
    },
    monto_extraido: {
      type: DataTypes.INTEGER,
      allowNull: false,
    },
    fecha_de_extraccion: {
      type: DataTypes.DATE,
      allowNull: false,
    },
    numero_de_cuenta: {
      type: DataTypes.INTEGER,
      allowNull: false,
    },
  },

  {
    sequelize: bd,
    tableName: 'extracciones',
  }
);
function agregaRelacion(m1: typeof Model /*报错位置*/, m2: any, fk: String) {
    m1.hasOne(m2, { foreignKey: fk });
    m2.hasOne(m1, { foreignKey: fk });
  }

报错信息:

类型为“typeof Model”的'this'上下文无法赋值给方法要求的this类型“ModelStatic<Model<{}, {}>>”。
类型“typeof Model”无法赋值给类型“new () => Model<{}, {}>”。
无法将抽象构造函数类型赋值给非抽象构造函数类型。ts(2684)

报错原因

Sequelize导出的Model是抽象基类,typeof Model取到的是抽象构造函数类型,而hasOne等关联方法要求挂载的主体是可直接实例化的非抽象模型构造器,也就是Sequelize内置的ModelStatic类型,抽象构造函数类型不满足约束就会抛错。另外代码里fk标注的String是JS包装对象类型,TS里应该用原始类型string,避免后续出现额外类型问题。

修复方法

  • 从sequelize包中导入内置的ModelStatic类型
  • 把两个模型参数的类型都改成ModelStatic<Model>,同时修正fk的类型为string

修复后函数代码:

// 补充导入ModelStatic
import { Model, DataTypes, ModelStatic } from 'sequelize';

// 模型定义部分无需改动

function agregaRelacion(m1: ModelStatic<Model>, m2: ModelStatic<Model>, fk: string) {
    m1.hasOne(m2, { foreignKey: fk });
    m2.hasOne(m1, { foreignKey: fk });
}

如果需要更严格的类型校验,可以给ModelStatic传入具体的模型类作为泛型参数,比如传入定义的Extracciones即ModelStatic<Extracciones>,通用关联场景下用ModelStatic<Model>就可以完全消除这个TS报错。

内容的提问来源于stack exchange,提问作者blas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:45:31