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

