使用 jsdoc 或打字稿对续集模型进行智能感知的正确方法

Proper way to have intellisense using jsdoc or typescript for a sequelize model

提问人:H3lltronik 提问时间:11/18/2023 更新时间:11/18/2023 访问量:19

问:

我正在开发一个非常古老的代码库,一个遗留项目,他们要求我为它添加更多的功能,我想以一种干净和有文档的方式完成它。

我正在为我的任务添加 sequelize ORM,做一个循环来正确添加我的实体之间的关系(下面的代码),我希望能够为我的实体提供智能感知/类型提示。

这是一个非常古老的项目,所以没有配置打字稿,我也无法以传统方式添加它,他们使用 pug 和一些 HTML 导入来获取 javascript 文件,所以我无法直接添加 tsconfig.ts 并添加 ts-node,我无法通过打字稿编译器传递整个代码,所以这就是为什么我认为直接使用 JSDoc 很好

(In case you know a way to use typescript with this consideration, only for getting better DX by having typehining and intellisense please let me know, I highly prefer typescript over JSDoc but I don't know how could I set it up with this consideration)

示例实体:

/** Usuario model */
module.exports = (sequelize) => {
  class Usuario extends Model {}
  // Usuario.findAll this show intellisense properly
  module.exports = { Usuario, };
  Usuario.init(...);

  Usuario.associations = (models) => {
    Usuario.belongsToMany(models.Pueblo, {
      through: "table",
      foreignKey: "fk",
      otherKey: "fk2",
    });
  };

  return Usuario;
};

DBConnection.js

由于我正在执行导入所有实体并在运行时链接它们的自动过程,因此 IDE 无法识别这些类型。

const { Sequelize, DataTypes } = require("sequelize");
const fs = require("fs");
const path = require("path");
const sequelize = new Sequelize(process.env.APP_PG_CONEXION);
const db = require("./sequelize-types");

fs.readdirSync(path.join(__dirname, "models"))
  .filter((file) => {
    return file.indexOf(".") !== 0 && file.slice(-3) === ".js";
  })
  .forEach((file) => {
    const model = require(path.join(__dirname, "models", file))(
      sequelize,
      DataTypes
    );
    db[model.name] = model;
  });

Object.keys(db).forEach((modelName) => {
  if (db[modelName].associations) {
    db[modelName].associations(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = { database: db };

我添加了一个包含一些 JSDoc 类型的sequelize_types.js文件,例如尝试“破解”类型提示以使其强制工作:

/**
 * @typedef {import("./models/Usuario").Usuario} Usuario
 *
 */

/**
 * @typedef {Object} DbInstance
 * @property {Usuario} Usuario
 *
 */

/** @type {DbInstance} */
const db = {};

module.exports = db;

然后,我将这个类型注入的 db 对象使用到 DBConnection 中,以填充链接的实体。

一切都很好,代码可以工作,但智能感知没有,如果我在另一个尝试这样的事情:

await database.Usuario.

我确实得到了一些类型提示,但好像它不是完整的类型集。

enter image description here

例如,无法识别 findAll 方法:

enter image description here

只是为了测试,如果我在 Usuario 实体文件中尝试相同的类型暗示测试,它确实有效:

enter image description here

在那里,它还具有其他文件中显示的一些方法,例如顶部的 addHook:

enter image description here


所以这就像缺少什么,我无法指出是什么。

我坚持认为,如果有更好的方法可以通过打字稿来做到这一点,我恳求你告诉我,只是考虑到我不能使用打字稿编译器,所以,不知何故,设置应该仅用于开发,并且为了打字/智能感知 🙏

谢谢。

Typescript visual-studio-code sequelize.js jsdoc

评论


答: 暂无答案