从枚举值映射类型键
Maping type keys from enum values
我有这么长的枚举:
enum Vegetable {
TOMATO
POTATO
ONION
# ...and many more
}
并输入
type VegetableInfo {
isRed: Boolean!
bbb: Int!
ccc: String!
}
现在我想在前端提供所有蔬菜信息。
我可以 return 一系列蔬菜:
type Query {
vegetables: [Vegetable]!
}
但是因为它将是索引数组而不是关联的,所以在前端 JS 中我将无法像这样快速访问所需蔬菜的数据:
vegetables.tomato.isRed // true
// or maybe
vegetables.TOMATO.isRed // true
相反,我将被迫编写一些搜索功能来检查番茄是否存在于任何项目中。我需要关联数组(带键的对象)。
我可以通过这样做轻松实现:
type Query {
vegetables: VegetablesInfo!
}
enum Vegetable {
TOMATO
POTATO
ONION
# ...and many more
}
type VegetablesInfo {
TOMATO: VegetableInfo!
POTATO: VegetableInfo!
ONION: VegetableInfo!
# ...and many more
}
type VegetableInfo {
isRed: Boolean!
bbb: Int!
ccc: String!
}
但是这里甚至没有使用枚举。我在 graphql 的其他部分仍然需要那个枚举。我将不得不在这两个地方重复每个 vgetable 名称,所以很糟糕。
我找不到任何方法从枚举生成类型键。下面的代码将不起作用,但是有这样的东西吗?
type VegetablesInfo {
...Vegetable: VegetableInfo!
}
GraphQL spec: The target field of a field selection must be defined on the scoped type of the selection set.
用简单的英语来说,不,您不能“动态”定义字段。类型只能有显式定义的字段。正如您所说,实际的解决方案是 return 一个 VegetableInfo
的列表(添加一个 name: Vegetable
字段)给客户端。客户端可以按名称简单地过滤目标 Vegetable
的列表:
// client.ts
const vegFinder = (name: Vegetable, vegetables: VegetableInfo[]): VegetableInfo | undefined => {
return vegetables.find((veg) => veg.name === name)
}
我有这么长的枚举:
enum Vegetable {
TOMATO
POTATO
ONION
# ...and many more
}
并输入
type VegetableInfo {
isRed: Boolean!
bbb: Int!
ccc: String!
}
现在我想在前端提供所有蔬菜信息。
我可以 return 一系列蔬菜:
type Query {
vegetables: [Vegetable]!
}
但是因为它将是索引数组而不是关联的,所以在前端 JS 中我将无法像这样快速访问所需蔬菜的数据:
vegetables.tomato.isRed // true
// or maybe
vegetables.TOMATO.isRed // true
相反,我将被迫编写一些搜索功能来检查番茄是否存在于任何项目中。我需要关联数组(带键的对象)。
我可以通过这样做轻松实现:
type Query {
vegetables: VegetablesInfo!
}
enum Vegetable {
TOMATO
POTATO
ONION
# ...and many more
}
type VegetablesInfo {
TOMATO: VegetableInfo!
POTATO: VegetableInfo!
ONION: VegetableInfo!
# ...and many more
}
type VegetableInfo {
isRed: Boolean!
bbb: Int!
ccc: String!
}
但是这里甚至没有使用枚举。我在 graphql 的其他部分仍然需要那个枚举。我将不得不在这两个地方重复每个 vgetable 名称,所以很糟糕。
我找不到任何方法从枚举生成类型键。下面的代码将不起作用,但是有这样的东西吗?
type VegetablesInfo {
...Vegetable: VegetableInfo!
}
GraphQL spec: The target field of a field selection must be defined on the scoped type of the selection set.
用简单的英语来说,不,您不能“动态”定义字段。类型只能有显式定义的字段。正如您所说,实际的解决方案是 return 一个 VegetableInfo
的列表(添加一个 name: Vegetable
字段)给客户端。客户端可以按名称简单地过滤目标 Vegetable
的列表:
// client.ts
const vegFinder = (name: Vegetable, vegetables: VegetableInfo[]): VegetableInfo | undefined => {
return vegetables.find((veg) => veg.name === name)
}