Какой тип sequelize.define() возвращает в TypeScript?

#node.js #typescript #sequelize.js

#node.js #typescript #sequelize.js

Вопрос:

Итак, я, наконец, решил попробовать TypeScript, из-за всего, что я слышал об этом, и того, что наличие статических типов полезно для меня. Я решил протестировать его, создав простой веб-API с sequelize, но у меня возникли проблемы с пониманием типов, возвращаемых из sequelize . Итак, у меня есть следующий импорт (обратите внимание, что я также установил модуль @types/sequelize npm:

 import sequelize = require('sequelize');
import  {DataTypes} from 'sequelize';
  

Я создаю свою модель следующим образом:

     const User:sequelize.Model= db.define('User',{
        id: {type:DataTypes.INTEGER, primaryKey:true},
        email:{type:DataTypes.STRING, allowNull:false},
        hashedPassword:{type:DataTypes.STRING,allowNull:false}
    });
  

Но я получаю эту ошибку:

 Type 'ModelCtor<Model<any, any>>' is missing the following properties from type 'Model<any,any>': _attributes, _creationAttributes, isNewRecord, where, and 16 more.
  

Но если я сделаю это:

 const User:any= db.define('User',{
    id: {type:DataTypes.INTEGER, primaryKey:true},
    email:{type:DataTypes.STRING, allowNull:false},
    hashedPassword:{type:DataTypes.STRING,allowNull:false}
});
  

Это работает нормально. Но, конечно, поскольку это TypeScript, я хочу воспользоваться преимуществами типов. Использование «any» противоречит цели. Как я могу узнать, какой тип мне следует использовать для моей модели? К сожалению, большая часть документации sequelize — это обычный javascript, поэтому я не могу найти примеры этого. Любая помощь приветствуется.

Ответ №1:

Из руководства

Начиная с версии 5, Sequelize предоставляет свои собственные определения TypeScript. Пожалуйста, обратите внимание, что поддерживается только TS> = 3.1.

Поскольку Sequelize в значительной степени зависит от назначений свойств среды выполнения, TypeScript не будет очень полезен из коробки. Для обеспечения работоспособности моделей требуется приличное количество объявлений типов вручную.

Вы можете найти использование sequelize.define with TypeScript в нижней части документа.

Например. "sequelize": "^5.21.3"

user.ts :

 import { Sequelize, DataTypes, Model, BuildOptions } from 'sequelize';

const db = new Sequelize('mysql://root:asd123@localhost:3306/mydb');

interface UserAttributes {
  readonly id: number;
  readonly email: string;
  readonly hashedPassword: string;
}
interface UserInstance extends Model<UserAttributes>, UserAttributes {}
type UserModelStatic = typeof Model amp; {
  new (values?: object, options?: BuildOptions): UserInstance;
};

const User = db.define('User', {
  id: { type: DataTypes.INTEGER, primaryKey: true },
  email: { type: DataTypes.STRING, allowNull: false },
  hashedPassword: { type: DataTypes.STRING, allowNull: false },
}) as UserModelStatic;

(async function test() {
  const user: UserInstance = await User.create({
    id: 1,
    hashedPassword: '123',
    email: 'test@gmail.com',
  });
  user.getDataValue('email');
})();
  

Комментарии:

1. Можете ли вы объяснить, что происходит в этой строке: интерфейс UserInstance расширяет модель<UserAttributes>, UserAttributes {} Насколько я знаю, TypeScript не поддерживает множественное наследование. Что здесь делает , ?

2. @tutiplain Это интерфейс, А НЕ класс. Интерфейс может расширять несколько интерфейсов в TypeScript.

3. Это действительно отстой, что вам нужно определить его дважды. Например, с помощью TypeGoose вы получаете типы из коробки.