如何根据接口或类型生成GQL查询载荷简化查询编写?
GraphQL查询字段复用方案
你设想的...xxx展开写法是GraphQL原生支持的**片段(Fragment)**能力,不需要手动实现Interface转字段字符串的逻辑,以下是可直接落地的方案:
- 原生片段复用(零额外依赖)
GraphQL标准本身就支持定义可复用的字段片段,一次定义后可以在任意查询中引用,完全避免重复编写相同字段。你只需要提前把和Interface对齐的字段定义为对应类型的片段即可:
# 定义与Interface字段完全匹配的可复用片段 fragment MySampleInterface on SampleResponse { field1 field2 field3 nestedField1 { fieldA } } # 业务查询直接展开片段即可,无需重复写字段 query SampleQuery($arg1: String, $arg2: String) { sampleSearch(arg1: $arg1, arg2: $arg2) { sampleResponse { ...MySampleInterface } } }
所有主流GraphQL客户端(Apollo、urql、Relay)都原生支持该语法,片段支持跨查询、跨文件引用。
TS类型与GQL字段自动同步(生产环境推荐方案)
如果你使用TypeScript,不需要手动维护TS Interface和GQL字段的一致性,也不需要自己写转换逻辑,可以通过GraphQL代码生成工具实现自动对齐:- 只需要编写一次GQL片段(即上述原生片段定义)
- 代码生成工具会扫描所有GQL文件,自动生成和字段100%匹配的TS类型定义
- 业务代码直接导入生成的类型使用即可,从根源上避免两边字段不同步的问题。
从已有TS Interface生成GQL片段(编译期实现)
如果你已经定义好了TS Interface,不想反过来从GQL生成类型,也不需要通过初始化字段值的方式做运行时转换,可以用基于TS类型系统的编译期工具,在构建阶段直接解析Interface的结构,自动生成对应的GQL片段字符串,全程不引入运行时代码。
注意:不要尝试在运行时从TS Interface提取字段。TS类型在编译后会被完全擦除,运行时不存在Interface的结构信息,这也是你之前尝试不初始化值就无法完成转换的核心原因。所有运行时转类型的方案都要求你额外写值级别的配置,本质和重复写字段没有区别。
内容的提问来源于stack exchange,提问作者Malik Abdulaziz
相关产品推荐
相关产品推荐

