Создание методов экземпляра в Sequelize Model с использованием Typescript - PullRequest
0 голосов
/ 01 февраля 2019

Я хочу расширить класс Sequelize Model, чтобы добавить другие методы экземпляра, но машинопись продолжает жаловаться на то, что "свойство 'prototype' не существует для типа 'Model'"

const MyModel = (sequelize: Sequelize.Sequelize, dataTypes: Sequelize.DataTypes) => {
  const User = sequelize.define<Instance, Attribute>(
    "users",
    {
      id: {
        type: dataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true,
      },
      email: {
        type: dataTypes.STRING
      },
      ...
    },
    {
      tableName: "users",
      ...
    },
  );

  User.prototype.verifyUser = function(password: string) {
    ...
  };

  return User;
};

Я ожидаю, что User.prototype.verifyUserработа но машинопись жалуется.Как добавить в наборы?

Ответы [ 2 ]

0 голосов
/ 16 марта 2019

После комментария @Shadrech у меня есть альтернатива (менее хакерская и абстрактная).

export interface UserAttributes {
   ...
}

export interface UserInstance extends Sequelize.Instance<UserAttributes>, UserAttributes {
}

interface UserModelInstanceMethods extends Sequelize.Model<UserInstance, UserAttributes> {

  // Came to this question looking for a better approach to this
  // You'll need root's definitions for invocation and prototype's for creation
  verifyPassword: (password: string) => Promise<boolean>;
  prototype: {
    verifyPassword: (password: string) => Promise<boolean>;
  };
}

const MyModel = (sequelize: Sequelize.Sequelize, dataTypes: Sequelize.DataTypes): UserModelInstanceMethods => {
  const User = sequelize.define<UserInstance, UserAttributes>(
      ...
  ) as UserModelInstanceMethods;

  User.prototype.verifyUser = function(password: string) {
    ...
  };

  return User;
}

Использование вашей модели:

sequelize.query("SELECT ...").then((user: UserInstance & UserModelInstanceMethods) => {
  user.verifyPassword(req.body.password) // <= from UserModelInstanceMethods
  user.getDataValue('name') // <= from UserInstance
})
0 голосов
/ 15 февраля 2019

Одно решение, которое я видел, это когда вы вводите тип после объявления Модели.Итак

interface UserModelInstanceMethods extends Sequelize.Model<Instance, Attributes> {
  prototype: {
    verifyPassword: (password: string) => Promise<boolean>;
  };
}

const MyModel = (sequelize: Sequelize.Sequelize, dataTypes: Sequelize.DataTypes) => {
  const User = sequelize.define<Instance, Attribute>(
    "users",
    {
      id: {
        type: dataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true,
      },
      email: {
        type: dataTypes.STRING
      },
      ...
    },
    {
      tableName: "users",
      ...
    },
  );

  User.prototype.verifyUser = function(password: string) {
    ...
  };

  return User;
} as Sequelize.Model<Instance, Attributes> & UserModelInstanceMethods;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...