是否有可能在打字稿类之外使用反射来创建graphql查询呢?
export class GraphQlMagicGenerator {
fetch(query: string, args: any) {
}
}
export class PatientsQuery extends GraphQlMagicGenerator {
constructor(patientId: number) {
super()
super.fetch("patient", {
id: patientId
})
}
id:()=> number
name:()=> string
age:()=> number
}
// ^ behind the scenes generates a query for patient with an id argument and fills in id, name and age
答案 0 :(得分:0)
不要这样做。因为
每个查询都需要开发一个类来匹配它。 class 会影响目标代码的大小。
GraphQL 具有高度的灵活性和动态性,它的查询参数决定了需要查询哪些字段。即使是同一个查询,不同的参数也会导致不同的返回类型。如果像这样尝试为每个查询手动定义返回类型会特别累人。
不同查询对应的数据类型包含一些相同的信息,代码中会有很多冗余。
我推荐我的框架,它为 GraphQL Client 带来了神奇的开发体验。
https://github.com/babyfish-ct/graphql-ts-client
支持代码生成器从服务器下载架构信息并生成客户端 TypeScript 文件。它不会为没有逻辑的功能生成“类”,因此不会影响目标代码的大小。
它允许你编写强类型的 GraphQL 请求,不仅是参数,还有一个强类型的树结构来描述应该查询哪些字段。
与其他类似框架不同,它不需要用户预先定义所有可能的查询,对于每一个具体的查询,可以根据强类型请求推断返回数据的类型强>.
答案 1 :(得分:-1)
您应该做相反的事情:在.graphql
中定义架构,然后从那里对TypeScript类型进行代码生成。我正在使用gql2ts(尽管还有其他人。)然后在构建阶段创建脚本。
您也可以自定义代码生成部分,以适合您团队的特定样式。例如,我删除了命名空间,覆盖了enum
的生成,并将生成的类型都标记为readonly
。但是您的架构是您的API,因此它应该定义您的类型。