我在使用 Sequelize 和 Typescript 开发我的 GraphQL Api 服务器时有点卡住了。我的问题与打字和概念问题有关。我已经根据数据库表及其关系定义了我的 Sequelize 模型。我在 GraphQL 解析器中使用这些模型,如下所示:
Query: {
part: (_, { id }, { models }) => models.Part.findByPk(id),
parts: (_, __, { models }) => models.Part.findAll(),
},
Part: {
subparts: async (parent, _, { models }) => {
const parentPart = await models.Part.findByPk(parent.id, { include: { model: models.Part, as: 'children' } });
if (parentPart) {
return parentPart.getChildren();
}
return [];
}
我的疑问与字段subparts
解析器的第一个参数的类型有关。根据我通过graphQL代码生成器 parent
生成的解析器类型应该具有我在架构中定义的相同类型,但这不是真的,它具有模型类型,因为模型实例是父解析器返回的。
更新:我在这里附上我的codegen.yml
,遵循非常有价值的评论。我为该类型定义了一个映射器,Part
这就是我应该是parent
解析器参数的类型。
schema: ./src/**/*.typedefs.ts
generates:
./src/types/graphql.generated.ts:
plugins:
- typescript
- typescript-resolvers
config:
noSchemaStitching: true
useIndexSignature: true
contextType: ../context#MyContext
mappers:
Part: ../part/part.types#IPart
MacroProduct: ../macro-product/macroProduct.types#IMacroProduct
这是我用作Part
映射器的类型:
export interface IPart {
id: number;
name: string;
thumb?: string;
subparts?: [IPart];
parentId?: number;
}
我认为它应该是parent
arg 的类型,但我使用的find
是 Sequelize 在查询解析器中提供的方法,所以这可能parent
也会影响类型。
我在理解什么和/或做错了什么?
非常感谢所有愿意花时间帮助我的人。