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

使用sequelize-typescript添加模型时出现类型不兼容错误

问题:sequelize-typescript添加模型时出现类型不兼容错误

我尝试用sequelize-typescript定义模型,代码如下:

type AppMetaDataAttributes = {
  id: string;
  name: string;
  version: string;
  createdAt: string;
  updatedAt: string;
};

type AppMetaDataCreationAttributes = Optional<AppMetaDataAttributes, 'id'>;

@Table
class AppMetaData extends Model<AppMetaDataAttributes, AppMetaDataCreationAttributes> {
  @Column
  id: string;

  @Column
  name: string;

  @Column
  version: string;

  @Column({ field: 'created_at' })
  createdAt: string;

  @Column({ field: 'updated_at' })
  updatedAt: string;

  constructor(id: string, name: string, version: string, createdAt: string, updated: string) {
    super();
    this.id = id;
    this.name = name;
    this.version = version;
    this.createdAt = createdAt;
    this.updatedAt = updated;
  }
}
MySqlInstance.addModels([AppMetaData]);

export default AppMetaData;

但在MySqlInstance.addModels([AppMetaData]);这一行出现了如下错误:

No overload matches this call.
  The last overload gave the following error.
    Type 'typeof AppMetaData' is not assignable to type 'string | ModelCtor<Model<any, any>>'.
      Type 'typeof AppMetaData' is not assignable to type 'ModelCtor<Model<any, any>>'.
        Type 'typeof AppMetaData' is not assignable to type 'new () => Model<any, any>'.
          Types of construct signatures are incompatible.
            Type 'new (id: string, name: string, version: string, createdAt: string, updated: string) => AppMetaData' is not assignable to type 'new () => Model<any, any>'.ts(2769)
sequelize.d.ts(16, 5): The last overload is declared here.

我是照着官方文档操作的,不清楚问题出在哪?


解决方案

问题出在你自定义的constructor上。sequelize-typescript的Model类要求构造函数签名必须兼容new () => Model<any, any>,也就是无参构造或符合框架内部的构造逻辑。你自定义的带参数构造函数破坏了这个类型约束,导致addModels无法识别你的模型类。

解决方法很简单:删除自定义的constructor。sequelize-typescript会自动处理模型实例的创建,不需要手动写构造函数赋值。如果需要创建实例,直接使用框架提供的方法即可。

修改后的代码如下:

type AppMetaDataAttributes = {
  id: string;
  name: string;
  version: string;
  createdAt: string;
  updatedAt: string;
};

type AppMetaDataCreationAttributes = Optional<AppMetaDataAttributes, 'id'>;

@Table
class AppMetaData extends Model<AppMetaDataAttributes, AppMetaDataCreationAttributes> {
  @Column
  id: string;

  @Column
  name: string;

  @Column
  version: string;

  @Column({ field: 'created_at' })
  createdAt: string;

  @Column({ field: 'updated_at' })
  updatedAt: string;
}
MySqlInstance.addModels([AppMetaData]);

export default AppMetaData;

创建模型实例推荐使用框架静态方法,比如:

const appMeta = await AppMetaData.create({
  id: '1',
  name: 'test-app',
  version: '1.0.0',
  createdAt: new Date().toISOString(),
  updatedAt: new Date().toISOString()
});

或者手动实例化后保存:

const appMeta = new AppMetaData();
appMeta.id = '1';
appMeta.name = 'test-app';
// 其他属性赋值
await appMeta.save();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 06:05:21