GraphQL: лучший способ управлять мутациями с помощью интерфейсов?
Я новичок в GraphQL, но мне это очень нравится. Теперь, когда я играю с интерфейсами и объединениями, я столкнулся с проблемой мутаций.
Предположим, что у меня есть эта схема:
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
}
Это не сработало по 2 причинам:
- Если я хочу передать объект в качестве параметра, это должен быть тип ввода. Но "Пицца", "Салат" и "BasicFood" - это просто "тип".
- Тип ввода не может реализовать интерфейс.
Итак, мой вопрос: как вы работаете с мутациями в этом контексте интерфейса, не слишком дублируя типы? Я хотел бы избежать использования типа Pizza для запросов и типа InputPizza для мутаций.
Спасибо за помощь.
1 ответ
Типы ввода и вывода - это принципиально разные вещи, просто потому, что у вас могут быть такие, которые представляют похожий объект (например, Pizza
а также PizzaInput
), это ложная эквивалентность.
Скажем в вашей схеме Pizza
имеет обязательное поле идентификатора (ваши идентификаторы не являются обязательными, но, вероятно, должны быть). Это, вероятно, не имеет смысла для PizzaInput
иметь поле идентификатора - оно будет сгенерировано сервером. Я хочу подчеркнуть, что во всех системах, кроме самых простых, будет происходить обработка, чтобы превратить вводимые пользователем данные в полноценный объект для возврата.
Вам просто нужно прикусить пулю и делать то, что похоже на дублированную работу, вы увидите преимущества в долгосрочной перспективе.