Sequelize Model Loader не обнаруживает методы модели

#typescript #sequelize.js #typescript-typings #sequelize-typescript

#typescript #sequelize.js #typescript-типизации #sequelize-typescript

Вопрос:

Я пытаюсь заставить sequelize работать с TypeScript, и в настоящее время у меня есть загрузчик модели, который работает должным образом

 import { Account, initAccount } from "./account";
import { initOrder, Order } from "./order";
import { initPrice, Price } from "./price";

import {Sequelize, Model} from 'sequelize';

const env = process.env.NODE_ENV || 'development';
const config = require(`${__dirname}/../../config/config.json`)[env];

interface db {
    Order: Order;
    Account: Account;
    Candle: Candle;
}

const sequelize = new Sequelize(config.database, config.username, config.password, config);

initAccount(sequelize);
initOrder(sequelize);
initPrice(sequelize);

const db = {
    sequelize,
    Sequelize,
    Account: Account,
    Order: Order,
    Price: Price,
}

export default db;
 

И я импортировал это в другой файл, выполнив import db from './models' , но если я начну печатать db.Order. , я должен получить список всех доступных методов продолжения, но я этого не делаю.

Я могу импортировать отдельные модели, используя import {Price} from './models/price'; , например, и это работает правильно. Хотя это противоречит цели использования одного загрузчика модели.

Как я могу изменить свой загрузчик модели, чтобы он отображал все методы, которые я могу запускать из одной функции?

Ниже приведен пример моих определений моделей

 import {
    Sequelize,
    Model,
    DataTypes,
    Optional,
} from "sequelize";

interface AccountAttributes {
    id?: number;
    accountId: string;
    currency: string;
    balance: number;
}

interface AccountCreationAttributes extends Optional<AccountAttributes, "id"> { }

export class Account extends Model<AccountAttributes, AccountCreationAttributes> implements AccountAttributes {
    public id!: number;
    public accountId!: string;
    public currency!: string;
    public balance!: number;
    
    // timestamps!
    public readonly createdAt!: Date;
    public readonly updatedAt!: Date;

}

export function initAccount(sequelize: Sequelize): void {
    Account.init({
        accountId: DataTypes.INTEGER,
        currency: DataTypes.STRING,
        balance: DataTypes.INTEGER
    }, {
        tableName: 'accounts',
        sequelize: sequelize,
    });
}
 

Обновить

Итак, теперь обнаруживаются разные методы модели, но если я пытаюсь получить доступ к свойству модели, я получаю эту ошибку Property 'currency' does not exist on type 'Model<any, any>'.

Код, который я использую, чтобы попытаться получить доступ к currency свойству, приведен ниже

 let accountCurrencies: Array<number> = [];
const accounts = await db.Account.findAll({
    limit: 50,
});

for (let i = 0; i < accounts .length; i  ) {
    accountCurrencies.push(accounts[i].currency);
}
 

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

1. показать определения моделей. И, по крайней мере, вы должны перейти any на что-то общее для всех ваших моделей, например, модель базового класса из Sequelize

2. @Anatoly Я обновил свой пост, чтобы показать определения моделей

3. Вы пробовали interface db { [key: string]: Model; } ?

4. Это создает некоторые другие проблемы, если я попробую это, например Type 'Model<any, any>' has no call signatures , на одном из моих findAll методов

5. Я понимаю. К сожалению, не существует общего типа для всех зарегистрированных моделей