4

我想覆盖由 Hasura 生成的 graphql 模式中特定字段的 jsonb 类型,并通过 graphql-code-generator 运行。

我有一个customListjsonb 类型的字段。ths 用于包含一个 json 对象数组。当使用带有 TypeScript 插件的 graphql-code-generator 时,生成的类型解析为any. 我试图弄清楚如何仅使用该特定字段的自定义类型来覆盖它。

下面的片段显示了 graphql 模式的相关部分,以及目标 graphql 类型覆盖。到目前为止,我尝试过的一切都会导致代码生成错误

GraphQl 模式

  //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
        },
     }
  }

目标覆盖类型

//clientTypes.graphql

type ListItem {
  itemId: string!
}

extend type MyEntity {
  ccards: [ListItem!]
}

谢谢你的帮助!

4

2 回答 2

1

Typescript 插件有一个scalars配置选项,您可以在其中为任何标量定义自定义类型。

首先,您必须定义一个自定义客户端模式。扩展MyEntity类型以具有特殊的标量而不是 Jsonb

客户端-schema.graphql

scalar CardList

extend type MyEntity {
    ccards: CardList!
}

然后创建一个包含此标量类型的文件:

标量.ts

type ListItem {
  itemId: string!
}

export type CardList = ListItem[]

然后将新模式和自定义类型添加到.ymlgraphql 代码生成的配置中,如下所示:

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

注意:路径应该相对于生成的文件

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

于 2021-08-18T13:45:06.200 回答
0

您可以将 codegen 指向一个新文件 - 比如说my-schema.js,然后按照您希望的方式操作模式。您可以使用任何您喜欢的工具(graphql-toolkit / graphql-compose / 直接 GraphQLSchema 操作)

于 2020-03-22T21:03:14.760 回答