Sequelize导入存在TypeScript问题

时间:2018-05-16 17:49:49

标签: typescript sequelize.js

const _ = require('lodash');
const fs = require('fs');
const path = require('path');
const pg = require('pg');
require('pg-parse-float')(pg);

const Sequelize = require('sequelize');

interface ImportedModel {
  name: string
}

export function models () {
  const dbOptions = {
    dialect: 'postgres',
    protocol: 'postgres',
    logging: false,
    // logging: console.log,
    dialectOptions: {
      ssl: false // TODO: Need to set ssl to true
    }
  };

  const dbUrl = process.env.DB_URL;
  const sequelize = new Sequelize(dbUrl, dbOptions);

  let db: Object = {};

  const modelPath = `${process.cwd()}/models`;
  fs.readdirSync(modelPath).forEach((file: String) => {
    if (file !== 'index.js' && path.extname(file) === '.js') {
      let model: ImportedModel = sequelize.import(path.join(modelPath, file));
      db[model.name] = model;
    }
  });

  Object.keys(db).forEach((modelName: String) => {
    if ('associate' in db[modelName]) {
      db[modelName].associate(db);
    }
  });

  return _.assign(db, {
    sequelize: sequelize,
    Sequelize: Sequelize
  });
}

具体来说,db[model.name] = model;有一个Typescript错误:

[ts] Element implicitly has an 'any' type because type 'Object' has no index signature.

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

通过添加界面解决:

interface DbModel {
  [key: string]: any
}

并将我的代码更改为:

  let db: DbModel = {}

  const modelPath = `${process.cwd()}/models`
  fs.readdirSync(modelPath).forEach((file: String) => {
    if (file !== 'index.js' && path.extname(file) === '.js') {
      let model: ImportedModel = sequelize.import(path.join(modelPath, file))
      db[model.name] = model
    }
  })

  Object.keys(db).forEach((modelName: string) => {
    if ('associate' in db[modelName]) {
      db[modelName].associate(db)
    }
  })