typescript - Hur man anpassar typen för ett fält som genererats av graphql-code-generator när man använder ett Hasura graphql-schema


Jag skulle vilja åsidosätta jsonb-typen för ett specifikt fält i ett GraphQL-schema som produceras av Hasura och körs genom graphql-code-generator.

Jag har ett fält customList av typen jsonb. Detta används för att innehålla en array av json-objekt. När jag använder graphql-code-generator med TypeScript-pluginet, löses den genererade typen till any. Jag försöker ta reda på hur man kan åsidosätta detta med en egen typ för just det fältet.

Följande utdrag visar den relevanta delen av graphql-schemat, och de riktade graphql-typöverskrivningarna. Hittills resulterar allt jag har försökt i codegen-fel

GraphQl-schema

  //schema.json  
  ...
  {
    "kind": "OBJECT",
    "name": “MyEntity”,
    "description": "columns and relationships of MyEntity",
    "fields": [
        ...
        {
        "name": "customList",
        "description": "",
        "args": [
            {
            "name": "path",
            "description": "JSON select path",
            "type": {
                "kind": "SCALAR",
                "name": "String",
                "ofType": null
            },
            "defaultValue": null
            }
        ],
        "type": {
            "kind": "SCALAR",
            "name": "jsonb",
            "ofType": null
        },
        "isDeprecated": false,
        "deprecationReason": null
        },
     }
  }

Riktade åsidosättningsslag

//clientTypes.graphql

type ListItem {
  itemId: string!
}

extend type MyEntity {
  ccards: [ListItem!]
}

Tack för all hjälp!

Svar #1

Det finns ett scalars-konfigurationsalternativ för Typescript-pluginet där du kan definiera en anpassad typ för varje skalär.

Först måste du definiera ett anpassat klientsideschema. Utöka MyEntity-typen för att ha en speciell skalär istället för Jsonb

client-schema.graphql

scalar CardList

extend type MyEntity {
    ccards: CardList!
}

Skapa sedan en fil som kommer att innehålla typen för denna skalär:

scalars.ts

type ListItem {
  itemId: string!
}

export type CardList = ListItem[]

Lägg sedan till det nya schemat och en anpassad typ i .yml-konfigurationen för graphql codegen på följande sätt:

schema:
  - https://your-remote-schema.url/v1/graphql:
documents: "src/**/*.ts"
generates:
  src/graphql/schema.ts:
    schema: src/graphql/client-schema.graphql
    plugins:
      - typescript
      - typescript-operations
    config:
      scalars:
        CardList: ./scalars#CardList

Obs: sökvägen ska vara relativ till den genererade filen

https://github.com/dotansimha/graphql-code-generator/issues/153#issuecomment-776735610

Svar #2

Du kan peka codegen mot en ny fil - låt oss säga my-schema.js, och sedan manipulera schemat på det sätt du vill. Du kan använda vilket verktyg du föredrar för det (graphql-toolkit/graphql-compose/direkt GraphQLSchema-manipulation)

Relaterade artiklar