我正在开发一个Typescript Sequelize项目,我的/models/index.ts
文件包含以下内容"导入此目录中的所有模型"功能:
var basename = path.basename(module.filename);
fs
.readdirSync(__dirname)
.filter(function (file) {
return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
})
.forEach(function (file) {
console.log(file);
var model = sequelize['import'](path.join(__dirname, file));
console.log('here');
// NOTE: you have to change from the original property notation to
// index notation or tsc will complain about undefined property.
db[model['name']] = model;
});
然后,我的模型结构如下/models/user.ts
:
export default function defineUser(sequelize: Sequelize.Sequelize, DataTypes) {
var User = sequelize.define<UserInstance, UserAttributes>('User', {
email: {
type: Sequelize.STRING,
unique: true,
validate: { isEmail: true }
},
password: Sequelize.STRING
});
return User;
};
但是,我无法将模型从一个文件导入到另一个文件中,无法执行以下操作:
import * as User from './user'
// ...
// definition of job model
// ...
Job.hasOne(User);
当我得到Argument of type 'typeof "~/models/job-response"' is not assignable to parameter of type 'Model<any, any>'.
然后:
〜/ node_modules \ sequelize \ lib中\协会\ mixin.js:95 [1]抛出新的错误(this.name +&#39;。&#39; + Utils.lowercaseFirst(Type.toString())+&#39;调用某些“不是”的实例Sequelize.Model&#39); [1] ^ [1] [1]错误:Job.function(srcModel,targetModel,options){ [1] Association.call(this); [1] [1]}调用的东西不是Sequelize.Model的实例 [1]在Model.hasOne(〜\ node_modules \ sequelize \ lib \ associations \ mixin.js:95:13)
我应该如何访问模型实例,以便将其传递给hasMany()
或hasOne()
函数。
答案 0 :(得分:0)
模型注册循环运行后,所有模型都将在db.models
上显示,并按名称键入。因此,您可以在同一个文件中或单独的文件中执行以下操作:
db.models.Job.hasOne(db.models.User)
我在单独的文件中找到定义关系很方便,因为如果你想定义关系的两面(即belongsTo / hasMany),那么你必须这样做(以避免循环依赖)