Graphql __resolveType返回空对象

Graphql __resolveType返回空对象,graphql,apollo,Graphql,Apollo,我正在尝试使用graphql实现表单验证。出于某种原因,当我运行此查询时: mutation validateForm($input: ValidateFormInput!) { test: validateForm( input: $input ) { id fieldValidations { ... on FailedValidation { id

我正在尝试使用graphql实现表单验证。出于某种原因,当我运行此查询时:

mutation validateForm($input: ValidateFormInput!) {
    test: validateForm(
       input: $input
    ) {
        id
        fieldValidations {
            ... on FailedValidation {
                id
            }
        }
    }
  }
还有一个字段验证没有错误('SuccessfullValidation'),当它应该返回{id:'some-id',fieldValidations:[{}]}时,它返回{id:'some-id',fieldValidations:[]}。这对我来说尤其没有任何意义,因为ID在两个字段中都被标记为不可为空的字段,但我没有收到任何错误

解析器

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!
}
类型定义

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的角度来看,
id
字段没有被请求,因此它不会对其执行空检查