首页 > 解决方案 > 为 Sequelize 创建中间 BaseModel 类

问题描述

我使用 Sequelize 作为数据 ORM。

我有一个简单的用户类。

import { Model } from "sequelize";
class User extends BaseModel {

}
export default User;

我可以像这样使用 User 类User.findByPk(1) Sequelize findByPk

我想要的是一个 BaseModel 类,它将扩展 SequelizeModel类,以便我可以在 BaseClass 中放置一些常用方法。

例如:我不想使用findByPk,而是想find在 BaseModel 中定义将调用findByPkInherited 类的方法,但我无法找到任何解决方案来获取 Parent 类中的子引用。

类似于staticPHP 中的东西。

标签: javascriptnode.jsinheritancestaticsequelize.js

解决方案


在这里你可以怎么做:

抽象(父)类:

import { Model } from "sequelize";

export default abstract class BaseModel <T,U>
    extends Model<T,U>
{

    protected myMethod(){}

}

用户(子)类:

import { DataTypes, Model, Optional } from 'sequelize'
import { sequelizeConnection } from "../helpers/databaseHelper"
import BaseModel from "../models/BaseModel";

interface UserAttributes {
    id: number;
    createdAt?: Date;
    updatedAt?: Date;
    deletedAt?: Date;
}
export interface UserInput extends Optional<UserAttributes, "id"> {}

export default 
class User<T=UserAttributes,U=UserInput> // <-- Pass the same generic construction as AbstractModel
extends BaseModel <T,U>  // <-- Here the trick
implements UserAttributes{

    public id!: number; 
    public name!: string;

    // timestamps!
    public readonly createdAt!: Date;
    public readonly updatedAt!: Date;
    public readonly deletedAt!: Date;

}
User.init({
    id: {
        type: DataTypes.UUID,
        defaultValue: DataTypes.UUIDV4,
        primaryKey: true,
    },
// Your attributes
},
 {
    timestamps: true,
    sequelize: sequelizeConnection,
    paranoid: true
})

推荐阅读