Ответ 1
Нет, спецификация не позволяет типам ввода реализовывать интерфейсы. А система типов GraphQL в целом не определяет какую-либо форму наследования (ключевое слово extends
добавляет поля к существующему типу и не для наследования). Даже интерфейсы не могут наследовать другие интерфейсы (хотя это кажется из-за изменений). Спецификация намеренно ограничена, чтобы оставаться простой. Это означает, что вы застряли в повторяющихся полях разных типов ввода.
Тем не менее, в зависимости от того, как вы строите свою схему, вы можете создать некий преобразователь типов, который программно добавляет общие поля на основе некоторых метаданных, например, директива.
Более того, вы можете решить свою проблему с помощью композиции (всегда помните композиция над наследованием). Э.Г.
input Name {
firstName: String
lastName: String
}
input UserInput {
name: Name
password: String!
}
input UserChangesInput {
name: Name
id: ID!
password: String
}
Теперь клиент должен отправить объект на более глубокий уровень, но это не похоже на большую цену за избежание больших повторяющихся кусков. На самом деле это может быть полезно и для клиента, поскольку теперь он может иметь общую логику для построения имен, независимо от того, использует ли их запрос/мутация.
В этом примере, где есть только 2 простых поля, этот подход является излишним, но в целом - я бы сказал, что это путь.