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

