从枚举值映射类型键

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)
}