GraphQL:如何使用接口管理变更操作是最佳实践?

5

我很喜欢GraphQL,但是我对它还不太熟悉。现在我正在尝试使用接口和联合类型,并且在使用mutation时遇到了问题。

假设我有以下这个schema:

interface FoodType {
  id: String
  type: String
}

type Pizza implements FoodType {
  id: String
  type: String
  pizzaType: String
  toppings: [String]
  size: String
}

type Salad implements FoodType {
  id: String
  type: String
  vegetarian: Boolean
  dressing: Boolean
}

type BasicFood implements FoodType {
  id: String
  type: String
}

现在,我想创建新的食品项目,所以我开始做这样的事情:
type Mutation {
    addPizza(input:Pizza):FoodType
    addSalad(input:Salad):FoodType
    addBasic(input:BasicFood):FoodType
}

这个方法没有生效的原因有两个:

  1. 如果我想将一个对象作为参数传递,那么它必须是“input”类型。但是,“Pizza”,“Salad”和“BasicFood”只是“type”类型。
  2. 一个输入类型不能实现一个接口。

所以,我的问题是:在这种接口的上下文中如何处理突变而不必过多重复类型?我想避免为查询创建一个Pizza类型和为突变创建一个InputPizza类型。

感谢您的帮助。

1个回答

2
输入和输出类型是根本不同的东西,仅仅因为你可能有一些恰好表示相似对象的类型(例如PizzaPizzaInput),这是一种虚假的等价关系。
假设在您的模式中Pizza具有强制要求的ID字段(您的ID并非强制性的,但可能应该是)。对于PizzaInput来说,拥有一个ID字段可能没有意义——它将由服务器生成。我的观点是,在除了最简单的系统之外,都需要对用户输入进行处理,以便将其转换为完整的对象返回。
你只需要咬紧牙关,做起看起来像是重复工作的事情,从长远来看,你会看到好处。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接