提问人:H3lltronik 提问时间:11/18/2023 更新时间:11/18/2023 访问量:19
使用 jsdoc 或打字稿对续集模型进行智能感知的正确方法
Proper way to have intellisense using jsdoc or typescript for a sequelize model
问:
我正在开发一个非常古老的代码库,一个遗留项目,他们要求我为它添加更多的功能,我想以一种干净和有文档的方式完成它。
我正在为我的任务添加 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.
我确实得到了一些类型提示,但好像它不是完整的类型集。
例如,无法识别 findAll 方法:
只是为了测试,如果我在 Usuario 实体文件中尝试相同的类型暗示测试,它确实有效:
在那里,它还具有其他文件中显示的一些方法,例如顶部的 addHook:
所以这就像缺少什么,我无法指出是什么。
我坚持认为,如果有更好的方法可以通过打字稿来做到这一点,我恳求你告诉我,只是考虑到我不能使用打字稿编译器,所以,不知何故,设置应该仅用于开发,并且为了打字/智能感知 🙏
谢谢。
答: 暂无答案
评论