如何自定义graphql-code-generator生成的Hasura schema特定字段类型
解决GraphQL Code Generator覆盖特定jsonb字段类型的问题
看起来你离解决问题只差几步啦!我帮你梳理下问题所在和可行的解决方案:
首先,修正你的schema扩展字段名
你在clientTypes.graphql里写的是ccards,但原Hasura schema里的字段是customList,字段名不匹配导致扩展完全没生效。先把这块改对:
type ListItem { itemId: string! } # 字段名要和原schema完全一致,同时根据实际业务调整非空约束 extend type MyEntity { customList: [ListItem!]! }
方案一:通过Code Generator配置直接生成正确类型
这是最规范的方式,让Code Generator直接基于合并后的schema生成类型:
- 将自定义扩展加入Code Generator的schema源
在你的codegen.yml(或codegen.ts)配置中,把clientTypes.graphql和Hasura生成的schema.json一起作为schema输入:
schema: - ./schema.json # Hasura生成的原始schema - ./clientTypes.graphql # 你的自定义类型扩展
- 配置TypeScript插件确保类型正确导入
如果你的ListItem类型需要单独导入,在Code Generator的配置里加上相关设置:
generates: src/generated/graphql.ts: plugins: - typescript - typescript-operations config: # 启用类型导入(避免类型重复定义) useTypeImports: true # 如果自定义类型在单独文件,指定导入路径 importTypesFrom: "../clientTypes"
这样Code Generator会自动合并两个schema,把MyEntity.customList的类型从jsonb(对应TS的any)替换成ListItem[]。
方案二:用TypeScript模块覆盖生成的类型
如果第一种方式因为某些原因不生效,你可以直接用TS的模块扩充(Module Augmentation)来强制覆盖类型:
在项目中创建一个类型扩充文件(比如src/graphql-types-augment.ts),内容如下:
// 导入生成的原始类型 import { MyEntity } from './generated/graphql'; // 定义你的自定义ListItem类型 type ListItem = { itemId: string; }; // 扩充MyEntity类型,覆盖customList的类型 declare module './generated/graphql' { interface MyEntity { customList: ListItem[]; } }
之后只要在项目入口或相关文件中导入这个扩充文件,TS就会自动应用这个类型覆盖。
常见错误排查
- 字段名不匹配:这是你当前最明显的问题,必须保证扩展的字段名和原schema完全一致
- schema扩展未被加载:一定要确保
clientTypes.graphql被加入Code Generator的schema配置中,否则扩展不会生效 - 非空约束不一致:如果原schema中
customList是可空的,扩展时也要对应调整(比如去掉!),否则会导致类型冲突
内容的提问来源于stack exchange,提问作者arhnee
相关产品推荐
相关产品推荐

