如何使用TypeScript正确键入Sequelize JOIN?

时间:2018-05-14 10:55:22

标签: node.js typescript sequelize.js

我试图在Sequelize中加入两张桌子:

const results = await MainModel.findAll({ include: [ JoinedModel ] });

但是,当我尝试从连接表中访问数据时,TypeScript(至少在--strict模式下)会抱怨:

const joinedField = results[0].joinedModel.joinedField;

导致:

Property 'joinedModel' does not exist on type 'Instance<MainModelAttributes>'.

尽管有TypeScript的投诉,上面的代码确实实际上为我提供了加入字段中的值。

输入此内容的正确方法是什么? (我在这里正确使用Sequelize吗?)

3 个答案:

答案 0 :(得分:0)

那是因为findAll的结果是承诺。试试这个:

MainModel.findAll({ include: [ JoinedModel ] }).then(result => {
 your code here...
});

答案 1 :(得分:0)

您可以执行类似的操作,因为sequelize函数会将结果作为包含sequelize元数据的模型实例返回。因此,通过对响应进行字符串化和解析,您可以获得结果的JSON表示形式。

let results = await MainModel.findAll({ include: [ JoinedModel ] });
results = JSON.parse(JSON.stringify(results));
const joinedField = results[0].joinedModel.joinedField;

OR

您可以使用原始的查询选项来将响应作为纯json获取。

let results = await MainModel.findAll({raw: true, include: [ JoinedModel ] });

参考:Sequelize Doc

答案 2 :(得分:0)

您可以以这种方式强制转换结果。

const results = await MainModel.findAll({ include: [ JoinedModel ] }) as Array<MainModel & {JoinedModel: JoinedModel}>;