【发布时间】:2019-06-01 00:10:56
【问题描述】:
上下文
我正在尝试构建一个代码生成工具。我喜欢使用 GraphQL,但是,当我拥有完整的堆栈时,我的前端使用字符串定义的 gql 查询调用我的后端似乎有点愚蠢。 GQL 是强类型的,因此我应该能够提供强类型的查询和响应。
问题
我不知道如何构建一个接口,以便我可以递归地反映并将参数从输入类型映射到目标类型。具体来说,我想将我的查询请求类型映射到一个 gql 查询响应类型。
const query: QueryRequest<Food.IFood> = {
name: true // true ==> implies inclusion in response
}
const res = await client.food(query)
console.log(res.name) // PASS - should compile
console.log(res.nodeId) // FAIL - should not compile. `nodeId` was not present in query
// Food.IFood is a TS interface, representative of my GQL schema. GQL => TS interfaces is a solved codegen problem already
// ref: https://github.com/cdaringe/gql-ts-client-codegen/blob/master/src/__tests__/fixture/namespace.ts
-
QueryRequest<T>将我的Food.IFood接口(不完全)映射到一个新类型,其中键映射到布尔值,表示 GQL 字段包含 - 但是,每个客户端方法都需要嗅探传递的
QueryRequest<T>以获得显式形状,并以某种方式将该显式形状映射到本质上的Partial<Food.IFood>。- 很清楚,我不想要
Partial--Partial对于存在哪些字段不明确。我希望客户端的响应具有明确的字段成员资格,作为输入的函数。
- 很清楚,我不想要
我了解,以上对我的 GQL 客户端的描述在很大程度上过于简化,并且放弃了符合所有 GQL 功能所需的其他复杂性。这很好。我在这篇文章中的主要目标是严格地看看是否有办法进行这种反射类型映射。
我已经开始草拟一个硬编码的目标 client.ts 文件,我希望潜在的输出如下所示:https://github.com/cdaringe/gql-ts-client-codegen/blob/master/src/target.ts
任何意见将不胜感激!谢谢。
【问题讨论】:
标签: typescript codegen