__resolveType возвращает пустые объекты

Я пытаюсь реализовать проверку формы с помощью graphql. По какой-то причине, когда я запускаю этот запрос:

mutation validateForm($input: ValidateFormInput!) {
    test: validateForm(
       input: $input
    ) {
        id
        fieldValidations {
            ... on FailedValidation {
                id
            }
        }
    }
  }

и есть одна проверка поля без ошибок («SuccessfullValidation»), она возвращает {id: «some-id», fieldValidations: [{}]}, когда она должна возвращать {id: «some-id», fieldValidations: [] }. Это особенно не имеет для меня никакого смысла, потому что идентификатор помечен как поле, не допускающее значение NULL, в обоих полях, однако я не получаю никаких ошибок.

Резольверы

FieldValidation: {
    __resolveType(obj: any) {
        if (obj.error || (obj._doc && obj._doc.error)) {
            return 'FailedValidation';
        }
        return 'SuccessfullValidation';
    },
}

Определения типов

type SuccessfullValidation {
    id: ID!

    filter: Filter!
    field: Field!
}

type TestError {
    hint: String!
    details: String!
}

type FailedValidation {
    id: ID!

    filter: Filter!
    field: Field!
    error: TestError
}

union FieldValidation = SuccessfullValidation | FailedValidation

extend type Query {
    getFieldValidations: [FieldValidation!]!
}

type FormValidation {
    id: ID!
    fieldValidations: [FieldValidation!]!
}

input ValidateFormInputFields {
    id: String!
    value: String! 
}

input ValidateFormInput {
    fields: [ValidateFormInputFields!]!
    userId: Int!
}


extend type Mutation {
    validateForm(input: ValidateFormInput!): FormValidation!
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
1
0
263
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это ожидаемое поведение. Из спец.:

Fragments can be defined inline within a selection set. This is done to conditionally include fields based on their runtime type.

Условия типа (например, on FailedValidation) — это просто способ отфильтровать, какие поля разрешаются на основе типа среды выполнения. Это не способ фильтрации фактического списка результатов — в GraphQL нет встроенной фильтрации.

Если вы хотите отфильтровать список FieldValidation, возвращаемый fieldValidations, вам нужно добавить какой-либо аргумент в поле, а затем реализовать соответствующую логику преобразователя.

Кроме того, вы не увидите ошибку проверки для ненулевого поля, равного нулю, если только это поле действительно не запрошено и оно не разрешается как нуль. В этом случае ваше условие типа во встроенном фрагменте фактически привело к пустому набору выбора — с точки зрения GraphQL поле id не запрашивалось, и поэтому оно не выполняет для него проверку на нулевое значение.

Другие вопросы по теме