问题描述
我有一个枚举,我正在尝试使用该枚举创建一个 GraphQl 类型。这种新类型中的每个属性都可以是可选的。每种类型返回相同的类型。
以下是枚举的示例:
enum AccountTypeEnum {
AccountType1
AccountType2
AccountType3
AccountType4
AccountType5
AccountType6
}
我想使用枚举创建一个类型,所以我不需要输入每个类型。这是一个缩短的版本,但有 20 多个 accountTypes - 每个都返回一组余额。
这是我想要的类型:
type BalanceList {
AccountType1: [Balances]
AccountType2: [Balances]
AccountType3: [Balances]
AccountType4: [Balances]
AccountType5: [Balances]
AccountType6: [Balances]
}
是否可以在不输入整个 Enum 的情况下创建 BalanceList?
此外,对于每个 Id 可能只有几个 AccountType,所以我需要考虑到这一点。例如:用户 1 可以有 AccountTypes 1 和 3(只有 AccountType1 和 AccountType3 会出现在响应对象上,其他 AccountTypes 不会出现在对象上)
我在文档中找不到这个,所以我不确定这是否可行
解决方法
如果您需要一个编程模式,您可以在服务器启动时构建它。您一直在以架构定义语言 (SDL) 呈现架构,但您可能可以在运行时构建其中的一部分并将其与 SDL 架构的其余部分一起传递给 typeDefs and resolvers。
这很复杂,而且可能是个坏主意。拥有静态模式有很多优点,这也是 GraphQL 的价值之一。静态模式很容易诊断。它允许在构建时通过许多工具检查查询的有效性(也许您现在不需要它,但可能会出现需要)。如果您的目标是避免维护 20 行代码,则可能不值得。
我认为您想要的是重新设计您的架构,以便“动态”部分成为建模数据的一部分。下面是一个例子:
type BalanceList {
balancesByType: [AccountTypeBalance!]!
}
type AccountTypeBalance {
accountType: AccountTypeEnum!
balances: [Balance!]!
}
可以简化。假设您打算在 BalanceList
类型中使用 User
,您甚至可能不需要 BalanceList
类型。下面呢
type User {
balanceList: [AccountTypeBalance!]!
}
这非常适合您的奖金要求,因为现在对于 user1,您可以返回一个只有两个元素的 balanceList。结果如下:
const user = {
id: "user1",balanceList: [
{ accountType: "AccountType1",balances: [ balance1,balance2 ] },{ accountType: "AccountType3",balances: [ balance3,balance4,balance5 ] },],};