Sequelize,Typescript和GraphQL:解析器的第一个参数类型

时间:2020-09-07 20:25:14

标签: typescript graphql sequelize.js apollo-server graphql-codegen

我在使用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 code generator 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的类型,但是我在查询解析器中使用了Sequelize提供的find方法,所以也许这也会影响parent类型

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

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

0 个答案:

没有答案