0

我在使用 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;
}

我认为它应该是parentarg 的类型,但我使用的find是 Sequelize 在查询解析器中提供的方法,所以这可能parent也会影响类型。

我在理解什么和/或做错了什么?

非常感谢所有愿意花时间帮助我的人。

4

0 回答 0