【发布时间】:2019-07-21 11:59:05
【问题描述】:
我正在尝试在后端节点项目中将 FlowJS 与 Sequelize 一起使用。但是,没有关于如何注释所涉及的数据类型的具体 FlowJS 文档,我得到的代码可以工作,但也会引发很多类型错误。
我有这个演示项目的完整工作版本on github。
我们从一个基本的模型定义开始。我最近一直在玩很多 Stellaris,所以我正在考虑这里的大银河战略。
// @flow
import Sequelize, { type Model } from "sequelize";
export type Empire = {
name: string,
species: string,
homeworld: string
};
const EmpireModel = (sequelize: Sequelize): Class<Model<Empire>> =>
sequelize.define("empires", {
name: { type: Sequelize.STRING, allowNull: false },
species: { type: Sequelize.STRING, allowNull: false },
homeworld: { type: Sequelize.STRING, allowNull: false }
});
module.exports = EmpireModel;
就我的想法而言,我想要一个包含所有 Sequelize 函数表操作函数(create、destroy、findAll 等)的数据类型,并且我认为我想要另一种数据类型,它只代表所涉及的实际对象(存储在数据库中的一个特定的帝国)。我可能完全错了,我愿意接受有关如何使上述内容变得更好的建议。
上面的代码类型检查很好,但我不确定Class<Model<Empire>> 是sequelize.define 返回值的正确注释。
现在我们进入应用程序本身:
// @flow
import Sequelize, { type Model } from "sequelize";
import { type Empire } from "./empire";
const sequelize = new Sequelize(
"postgres://postgres:sequelize@localhost:5432/sqldemo"
);
const main = async () => {
const EmpireModel: Class<Model<Empire>> = await require("./empire")(
sequelize
);
const empire: Model<Empire> = await EmpireModel.create({
name: "Sildaran Republic",
species: "Sildar",
homeworld: "Sakatarola"
});
const empires = await EmpireModel.findAll();
console.log(empires);
empires.map(empire => {
console.log("[Empire] ", empire.name);
console.log("[Founding Species] ", empire.species);
console.log("[Homeworld] ", empire.homeworld);
});
};
这段代码实际上运行正确,但类型检查器在await Empires.findAll() 行标记了一个错误。错误信息是
Cannot call await with `EmpireModel.findAll()` bound to `p` because:
- Either cannot get `empire.name` because property `name` is missing in `Model` [1].
- Or cannot call `empires.map` because property `map` is missing in `Promise` [2].
src/index.js:20:25
20| const empires = await EmpireModel.findAll();
^^^^^^^^^^^^^^^^^^^^^
References:
flow-typed/npm/sequelize_v4.x.x.js:3264:72
3264| options?: FindOptions<TAttributes & TCustomAttributes>): Promise<this[]>,
^^^^ [1]
flow-typed/npm/sequelize_v4.x.x.js:3264:64
3264| options?: FindOptions<TAttributes & TCustomAttributes>): Promise<this[]>,
^^^^^^^^^^^^^^^ [2]
所以,我实际上有几个具体问题:
- 在
empires.js中分配给EmpireModel的实际正确类型是什么? -
await require("./empire")(sequelize);的返回值的实际类型是什么,以及当我弄错时如何让 Flow 中断(Flow 对我在此处指定的任何类型感到满意,并且仅在以后使用该值时标记错误方式与类型不一致)
我也愿意接受所有其他建议以使此代码更正确。
【问题讨论】:
标签: javascript node.js sequelize.js flowtype