#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
на что-то общее для всех ваших моделей, например, модель базового класса из Sequelize2. @Anatoly Я обновил свой пост, чтобы показать определения моделей
3. Вы пробовали
interface db { [key: string]: Model; }
?4. Это создает некоторые другие проблемы, если я попробую это, например
Type 'Model<any, any>' has no call signatures
, на одном из моихfindAll
методов5. Я понимаю. К сожалению, не существует общего типа для всех зарегистрированных моделей