代码之家  ›  专栏  ›  技术社区  ›  Shamoon

Sequelize导入存在TypeScript问题

  •  2
  • Shamoon  · 技术社区  · 6 年前
    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 回复  |  直到 6 年前
        1
  •  0
  •   Shamoon    6 年前

    通过添加接口解决:

    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)
        }
      })