Skip to content

Interface & Union Types

GraphQL union & interface types are both ways to allow a GraphQL field to return one of a set of object types.

The difference between the two is that interface types declare a common set of fields that must be implemented by the object types that implement the interface, while union types declare a set of object types and those objects don’t have to share any fields.

Interface Types

In @graphql-ts/schema, you can define interface types using the g.interface function and then use the interfaces option on object types to declare that the object type implements the interface:

const
const Entity: GInterfaceType<unknown, {
id: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>;
name: GField<...>;
}, {
...;
}>
Entity
=
const g: GWithContext<{
...;
}>
g
.
interface: <unknown>(youOnlyNeedToPassATypeParameterToThisFunctionYouPassTheActualRuntimeArgsOnTheResultOfThisFunction?: {
youOnlyNeedToPassATypeParameterToThisFunctionYouPassTheActualRuntimeArgsOnTheResultOfThisFunction: true;
}) => <Fields, Interfaces>(config: {
...;
}) => GInterfaceType<...>
interface
()({
name: string
name
: "Entity",
fields: {
id: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>;
name: GField<...>;
} | (() => {
id: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>;
name: GField<...>;
})
fields
: {
id: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
...;
}>, {
...;
}>
id
:
const g: GWithContext<{
...;
}>
g
.
field: <unknown, GNonNull<GScalarType<string, string>>, unknown, any>(field: FieldFuncArgs<unknown, any, GNonNull<GScalarType<string, string>>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}> & {
...;
}) => GField<...>
field
({
type: GNonNull<GScalarType<string, string>>
type
:
const g: GWithContext<{
...;
}>
g
.
nonNull: <GScalarType<string, string>>(of: GScalarType<string, string>) => GNonNull<GScalarType<string, string>>
nonNull
(
const g: GWithContext<{
...;
}>
g
.
type ID: GScalarType<string, string>
ID
) }),
name: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
...;
}>, {
...;
}>
name
:
const g: GWithContext<{
...;
}>
g
.
field: <unknown, GNonNull<GScalarType<string, string>>, unknown, any>(field: FieldFuncArgs<unknown, any, GNonNull<GScalarType<string, string>>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}> & {
...;
}) => GField<...>
field
({
type: GNonNull<GScalarType<string, string>>
type
:
const g: GWithContext<{
...;
}>
g
.
nonNull: <GScalarType<string, string>>(of: GScalarType<string, string>) => GNonNull<GScalarType<string, string>>
nonNull
(
const g: GWithContext<{
...;
}>
g
.
type String: GScalarType<string, string>
String
) }),
},
});
type
type UserSource = {
__typename: "User";
id: string;
name: string;
}
UserSource
= {
__typename: "User"
__typename
: "User";
id: string
id
: string;
name: string
name
: string };
const
const User: GObjectType<UserSource, {
...;
}>
User
=
const g: GWithContext<{
...;
}>
g
.
object: <UserSource>(youOnlyNeedToPassATypeParameterToThisFunctionYouPassTheActualRuntimeArgsOnTheResultOfThisFunction?: {
youOnlyNeedToPassATypeParameterToThisFunctionYouPassTheActualRuntimeArgsOnTheResultOfThisFunction: true;
}) => <Fields, Interfaces>(config: {
...;
} & Omit<...>) => GObjectType<...>
object
<
type UserSource = {
__typename: "User";
id: string;
name: string;
}
UserSource
>()({
name: string
name
: "User",
interfaces?: [GInterfaceType<unknown, {
id: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>;
name: GField<...>;
}, {
...;
}>]
interfaces
: [
const Entity: GInterfaceType<unknown, {
id: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>;
name: GField<...>;
}, {
...;
}>
Entity
],
fields: {
id: GField<UserSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>;
name: GField<...>;
} | (() => {
id: GField<UserSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>;
name: GField<...>;
})
fields
: {
id: GField<UserSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
...;
}>, {
...;
}>
id
:
const g: GWithContext<{
...;
}>
g
.
field: <UserSource, GNonNull<GScalarType<string, string>>, unknown, any>(field: FieldFuncArgs<UserSource, any, GNonNull<GScalarType<string, string>>, {
...;
}> & {
...;
}) => GField<...>
field
({
type: GNonNull<GScalarType<string, string>>
type
:
const g: GWithContext<{
...;
}>
g
.
nonNull: <GScalarType<string, string>>(of: GScalarType<string, string>) => GNonNull<GScalarType<string, string>>
nonNull
(
const g: GWithContext<{
...;
}>
g
.
type ID: GScalarType<string, string>
ID
) }),
name: GField<UserSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
...;
}>, {
...;
}>
name
:
const g: GWithContext<{
...;
}>
g
.
field: <UserSource, GNonNull<GScalarType<string, string>>, unknown, any>(field: FieldFuncArgs<UserSource, any, GNonNull<GScalarType<string, string>>, {
...;
}> & {
...;
}) => GField<...>
field
({
type: GNonNull<GScalarType<string, string>>
type
:
const g: GWithContext<{
...;
}>
g
.
nonNull: <GScalarType<string, string>>(of: GScalarType<string, string>) => GNonNull<GScalarType<string, string>>
nonNull
(
const g: GWithContext<{
...;
}>
g
.
type String: GScalarType<string, string>
String
) }),
},
});
type
type OrganisationSource = {
__typename: "Organisation";
id: string;
name: string;
}
OrganisationSource
= {
__typename: "Organisation"
__typename
: "Organisation";
id: string
id
: string;
name: string
name
: string;
};
const
const Organisation: GObjectType<OrganisationSource, {
...;
}>
Organisation
=
const g: GWithContext<{
...;
}>
g
.
object: <OrganisationSource>(youOnlyNeedToPassATypeParameterToThisFunctionYouPassTheActualRuntimeArgsOnTheResultOfThisFunction?: {
youOnlyNeedToPassATypeParameterToThisFunctionYouPassTheActualRuntimeArgsOnTheResultOfThisFunction: true;
}) => <Fields, Interfaces>(config: {
...;
} & Omit<...>) => GObjectType<...>
object
<
type OrganisationSource = {
__typename: "Organisation";
id: string;
name: string;
}
OrganisationSource
>()({
name: string
name
: "Organisation",
interfaces?: [GInterfaceType<unknown, {
id: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>;
name: GField<...>;
}, {
...;
}>]
interfaces
: [
const Entity: GInterfaceType<unknown, {
id: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>;
name: GField<...>;
}, {
...;
}>
Entity
],
fields: {
id: GField<OrganisationSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>;
name: GField<...>;
members: GField<...>;
} | (() => {
id: GField<OrganisationSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>;
name: GField<...>;
members: GField<...>;
})
fields
: {
id: GField<OrganisationSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
...;
}>, {
...;
}>
id
:
const g: GWithContext<{
...;
}>
g
.
field: <OrganisationSource, GNonNull<GScalarType<string, string>>, unknown, any>(field: FieldFuncArgs<OrganisationSource, any, GNonNull<GScalarType<string, string>>, {
...;
}> & {
...;
}) => GField<...>
field
({
type: GNonNull<GScalarType<string, string>>
type
:
const g: GWithContext<{
...;
}>
g
.
nonNull: <GScalarType<string, string>>(of: GScalarType<string, string>) => GNonNull<GScalarType<string, string>>
nonNull
(
const g: GWithContext<{
...;
}>
g
.
type ID: GScalarType<string, string>
ID
) }),
name: GField<OrganisationSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
...;
}>, {
...;
}>
name
:
const g: GWithContext<{
...;
}>
g
.
field: <OrganisationSource, GNonNull<GScalarType<string, string>>, unknown, any>(field: FieldFuncArgs<OrganisationSource, any, GNonNull<GScalarType<string, string>>, {
...;
}> & {
...;
}) => GField<...>
field
({
type: GNonNull<GScalarType<string, string>>
type
:
const g: GWithContext<{
...;
}>
g
.
nonNull: <GScalarType<string, string>>(of: GScalarType<string, string>) => GNonNull<GScalarType<string, string>>
nonNull
(
const g: GWithContext<{
...;
}>
g
.
type String: GScalarType<string, string>
String
) }),
members: GField<OrganisationSource, any, GList<GObjectType<UserSource, {
...;
}>>, unknown, {
...;
}>
members
:
const g: GWithContext<{
...;
}>
g
.
field: <OrganisationSource, GList<GObjectType<UserSource, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>>, () => never[], any>(field: FieldFuncArgs<...> & {
...;
}) => GField<...>
field
({
type: GList<GObjectType<UserSource, {
...;
}>>
type
:
const g: GWithContext<{
...;
}>
g
.
list: <GObjectType<UserSource, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>>(of: GObjectType<UserSource, {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}>) => GList<...>
list
(
const User: GObjectType<UserSource, {
...;
}>
User
),
resolve: ((source: OrganisationSource, args: {}, context: {
loadEntity: (id: string) => Promise<UserSource | OrganisationSource | null>;
}, info: GraphQLResolveInfo) => InferValueFromOutputType<...>) & (() => never[])
resolve
: () => [] }),
},
});

Union Types

Union types are defined using the g.union function:

type
type UserSource = {
__typename: "User";
id: string;
name: string;
}
UserSource
= {
__typename: "User"
__typename
: "User";
id: string
id
: string;
name: string
name
: string };
const
const User: GObjectType<UserSource, {
search: (query: string) => Array<UserSource | PostSource>;
}>
User
=
const g: GWithContext<{
search: (query: string) => Array<UserSource | PostSource>;
}>
g
.
object: <UserSource>(youOnlyNeedToPassATypeParameterToThisFunctionYouPassTheActualRuntimeArgsOnTheResultOfThisFunction?: {
youOnlyNeedToPassATypeParameterToThisFunctionYouPassTheActualRuntimeArgsOnTheResultOfThisFunction: true;
}) => <Fields, Interfaces>(config: {
...;
} & Omit<...>) => GObjectType<...>
object
<
type UserSource = {
__typename: "User";
id: string;
name: string;
}
UserSource
>()({
name: string
name
: "User",
fields: {
id: GField<UserSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
...;
}>, {
...;
}>;
name: GField<...>;
} | (() => {
id: GField<UserSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
...;
}>, {
...;
}>;
name: GField<...>;
})
fields
: {
id: GField<UserSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
search: (query: string) => Array<UserSource | PostSource>;
}>, {
search: (query: string) => Array<UserSource | PostSource>;
}>
id
:
const g: GWithContext<{
search: (query: string) => Array<UserSource | PostSource>;
}>
g
.
field: <UserSource, GNonNull<GScalarType<string, string>>, unknown, any>(field: FieldFuncArgs<UserSource, any, GNonNull<GScalarType<string, string>>, {
...;
}> & {
...;
}) => GField<...>
field
({
type: GNonNull<GScalarType<string, string>>
type
:
const g: GWithContext<{
search: (query: string) => Array<UserSource | PostSource>;
}>
g
.
nonNull: <GScalarType<string, string>>(of: GScalarType<string, string>) => GNonNull<GScalarType<string, string>>
nonNull
(
const g: GWithContext<{
search: (query: string) => Array<UserSource | PostSource>;
}>
g
.
type ID: GScalarType<string, string>
ID
) }),
name: GField<UserSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
search: (query: string) => Array<UserSource | PostSource>;
}>, {
search: (query: string) => Array<UserSource | PostSource>;
}>
name
:
const g: GWithContext<{
search: (query: string) => Array<UserSource | PostSource>;
}>
g
.
field: <UserSource, GNonNull<GScalarType<string, string>>, unknown, any>(field: FieldFuncArgs<UserSource, any, GNonNull<GScalarType<string, string>>, {
...;
}> & {
...;
}) => GField<...>
field
({
type: GNonNull<GScalarType<string, string>>
type
:
const g: GWithContext<{
search: (query: string) => Array<UserSource | PostSource>;
}>
g
.
nonNull: <GScalarType<string, string>>(of: GScalarType<string, string>) => GNonNull<GScalarType<string, string>>
nonNull
(
const g: GWithContext<{
search: (query: string) => Array<UserSource | PostSource>;
}>
g
.
type String: GScalarType<string, string>
String
) }),
},
});
type
type PostSource = {
__typename: "Post";
id: string;
title: string;
}
PostSource
= {
__typename: "Post"
__typename
: "Post";
id: string
id
: string;
title: string
title
: string };
const
const Post: GObjectType<PostSource, {
search: (query: string) => Array<UserSource | PostSource>;
}>
Post
=
const g: GWithContext<{
search: (query: string) => Array<UserSource | PostSource>;
}>
g
.
object: <PostSource>(youOnlyNeedToPassATypeParameterToThisFunctionYouPassTheActualRuntimeArgsOnTheResultOfThisFunction?: {
youOnlyNeedToPassATypeParameterToThisFunctionYouPassTheActualRuntimeArgsOnTheResultOfThisFunction: true;
}) => <Fields, Interfaces>(config: {
...;
} & Omit<...>) => GObjectType<...>
object
<
type PostSource = {
__typename: "Post";
id: string;
title: string;
}
PostSource
>()({
name: string
name
: "Post",
fields: {
id: GField<PostSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
...;
}>, {
...;
}>;
title: GField<...>;
} | (() => {
id: GField<PostSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
...;
}>, {
...;
}>;
title: GField<...>;
})
fields
: {
id: GField<PostSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
search: (query: string) => Array<UserSource | PostSource>;
}>, {
search: (query: string) => Array<UserSource | PostSource>;
}>
id
:
const g: GWithContext<{
search: (query: string) => Array<UserSource | PostSource>;
}>
g
.
field: <PostSource, GNonNull<GScalarType<string, string>>, unknown, any>(field: FieldFuncArgs<PostSource, any, GNonNull<GScalarType<string, string>>, {
...;
}> & {
...;
}) => GField<...>
field
({
type: GNonNull<GScalarType<string, string>>
type
:
const g: GWithContext<{
search: (query: string) => Array<UserSource | PostSource>;
}>
g
.
nonNull: <GScalarType<string, string>>(of: GScalarType<string, string>) => GNonNull<GScalarType<string, string>>
nonNull
(
const g: GWithContext<{
search: (query: string) => Array<UserSource | PostSource>;
}>
g
.
type ID: GScalarType<string, string>
ID
) }),
title: GField<PostSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, {
search: (query: string) => Array<UserSource | PostSource>;
}>, {
search: (query: string) => Array<UserSource | PostSource>;
}>
title
:
const g: GWithContext<{
search: (query: string) => Array<UserSource | PostSource>;
}>
g
.
field: <PostSource, GNonNull<GScalarType<string, string>>, unknown, any>(field: FieldFuncArgs<PostSource, any, GNonNull<GScalarType<string, string>>, {
...;
}> & {
...;
}) => GField<...>
field
({
type: GNonNull<GScalarType<string, string>>
type
:
const g: GWithContext<{
search: (query: string) => Array<UserSource | PostSource>;
}>
g
.
nonNull: <GScalarType<string, string>>(of: GScalarType<string, string>) => GNonNull<GScalarType<string, string>>
nonNull
(
const g: GWithContext<{
search: (query: string) => Array<UserSource | PostSource>;
}>
g
.
type String: GScalarType<string, string>
String
) }),
},
});
const
const SearchResult: GUnionType<UserSource | PostSource, {
search: (query: string) => Array<UserSource | PostSource>;
}>
SearchResult
=
const g: GWithContext<{
search: (query: string) => Array<UserSource | PostSource>;
}>
g
.
union: <GObjectType<UserSource, {
search: (query: string) => Array<UserSource | PostSource>;
}> | GObjectType<PostSource, {
search: (query: string) => Array<UserSource | PostSource>;
}>>(config: {
...;
}) => GUnionType<...>
union
({
name: string
name
: "SearchResult",
types: readonly (GObjectType<UserSource, {
search: (query: string) => Array<UserSource | PostSource>;
}> | GObjectType<PostSource, {
search: (query: string) => Array<UserSource | PostSource>;
}>)[] | (() => readonly (GObjectType<...> | GObjectType<...>)[])
types
: [
const User: GObjectType<UserSource, {
search: (query: string) => Array<UserSource | PostSource>;
}>
User
,
const Post: GObjectType<PostSource, {
search: (query: string) => Array<UserSource | PostSource>;
}>
Post
],
});

resolveType and isTypeOf

In the examples above, we have included __typename fields on the source objects. By default GraphQL.js uses __typename to determine what concrete object type is being returned when returning a union or interface type.

There are also two other options:

  • resolveType on a interface/union types, this accepts a source type and returns the object type name that it corresponds to
  • isTypeOf on object types, this accepts a source type and returns a boolean indicating if the object type is the correct type for the source type

You can use either one, you don’t need to use both.

const
const Entity: GInterfaceType<{
entityType: string;
}, {
id: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, unknown>, unknown>;
name: GField<...>;
}, unknown>
Entity
=
const g: GWithContext<unknown>
g
.
interface: <{
entityType: string;
}>(youOnlyNeedToPassATypeParameterToThisFunctionYouPassTheActualRuntimeArgsOnTheResultOfThisFunction?: {
youOnlyNeedToPassATypeParameterToThisFunctionYouPassTheActualRuntimeArgsOnTheResultOfThisFunction: true;
}) => <Fields, Interfaces>(config: {
...;
}) => GInterfaceType<...>
interface
<{
entityType: string
entityType
: string }>()({
name: string
name
: "Entity",
fields: {
id: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, unknown>, unknown>;
name: GField<...>;
} | (() => {
id: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, unknown>, unknown>;
name: GField<...>;
})
fields
: {
id: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, unknown>, unknown>
id
:
const g: GWithContext<unknown>
g
.
field: <unknown, GNonNull<GScalarType<string, string>>, unknown, any>(field: FieldFuncArgs<unknown, any, GNonNull<GScalarType<string, string>>, unknown> & {
...;
}) => GField<...>
field
({
type: GNonNull<GScalarType<string, string>>
type
:
const g: GWithContext<unknown>
g
.
nonNull: <GScalarType<string, string>>(of: GScalarType<string, string>) => GNonNull<GScalarType<string, string>>
nonNull
(
const g: GWithContext<unknown>
g
.
type ID: GScalarType<string, string>
ID
) }),
name: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, unknown>, unknown>
name
:
const g: GWithContext<unknown>
g
.
field: <unknown, GNonNull<GScalarType<string, string>>, unknown, any>(field: FieldFuncArgs<unknown, any, GNonNull<GScalarType<string, string>>, unknown> & {
...;
}) => GField<...>
field
({
type: GNonNull<GScalarType<string, string>>
type
:
const g: GWithContext<unknown>
g
.
nonNull: <GScalarType<string, string>>(of: GScalarType<string, string>) => GNonNull<GScalarType<string, string>>
nonNull
(
const g: GWithContext<unknown>
g
.
type String: GScalarType<string, string>
String
) }),
},
resolveType?: Maybe<GraphQLTypeResolver<{
entityType: string;
}, unknown>>
resolveType
(
source: {
entityType: string;
}
source
) {
return
source: {
entityType: string;
}
source
.
entityType: string
entityType
;
},
});
type
type UserSource = {
entityType: "User";
id: string;
name: string;
}
UserSource
= {
entityType: "User"
entityType
: "User";
id: string
id
: string;
name: string
name
: string };
const
const User: GObjectType<UserSource, unknown>
User
=
const g: GWithContext<unknown>
g
.
object: <UserSource>(youOnlyNeedToPassATypeParameterToThisFunctionYouPassTheActualRuntimeArgsOnTheResultOfThisFunction?: {
youOnlyNeedToPassATypeParameterToThisFunctionYouPassTheActualRuntimeArgsOnTheResultOfThisFunction: true;
}) => <Fields, Interfaces>(config: {
...;
} & Omit<...>) => GObjectType<...>
object
<
type UserSource = {
entityType: "User";
id: string;
name: string;
}
UserSource
>()({
name: string
name
: "User",
interfaces?: [GInterfaceType<{
entityType: string;
}, {
id: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, unknown>, unknown>;
name: GField<...>;
}, unknown>]
interfaces
: [
const Entity: GInterfaceType<{
entityType: string;
}, {
id: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, unknown>, unknown>;
name: GField<...>;
}, unknown>
Entity
],
fields: {
id: GField<UserSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, unknown>, unknown>;
name: GField<...>;
} | (() => {
id: GField<UserSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, unknown>, unknown>;
name: GField<...>;
})
fields
: {
id: GField<UserSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, unknown>, unknown>
id
:
const g: GWithContext<unknown>
g
.
field: <UserSource, GNonNull<GScalarType<string, string>>, unknown, any>(field: FieldFuncArgs<UserSource, any, GNonNull<GScalarType<string, string>>, unknown> & {
...;
}) => GField<...>
field
({
type: GNonNull<GScalarType<string, string>>
type
:
const g: GWithContext<unknown>
g
.
nonNull: <GScalarType<string, string>>(of: GScalarType<string, string>) => GNonNull<GScalarType<string, string>>
nonNull
(
const g: GWithContext<unknown>
g
.
type ID: GScalarType<string, string>
ID
) }),
name: GField<UserSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, unknown>, unknown>
name
:
const g: GWithContext<unknown>
g
.
field: <UserSource, GNonNull<GScalarType<string, string>>, unknown, any>(field: FieldFuncArgs<UserSource, any, GNonNull<GScalarType<string, string>>, unknown> & {
...;
}) => GField<...>
field
({
type: GNonNull<GScalarType<string, string>>
type
:
const g: GWithContext<unknown>
g
.
nonNull: <GScalarType<string, string>>(of: GScalarType<string, string>) => GNonNull<GScalarType<string, string>>
nonNull
(
const g: GWithContext<unknown>
g
.
type String: GScalarType<string, string>
String
) }),
},
});
const
const Entity: GInterfaceType<unknown, {
id: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, unknown>, unknown>;
name: GField<...>;
}, unknown>
Entity
=
const g: GWithContext<unknown>
g
.
interface: <unknown>(youOnlyNeedToPassATypeParameterToThisFunctionYouPassTheActualRuntimeArgsOnTheResultOfThisFunction?: {
youOnlyNeedToPassATypeParameterToThisFunctionYouPassTheActualRuntimeArgsOnTheResultOfThisFunction: true;
}) => <Fields, Interfaces>(config: {
...;
}) => GInterfaceType<...>
interface
()({
name: string
name
: "Entity",
fields: {
id: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, unknown>, unknown>;
name: GField<...>;
} | (() => {
id: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, unknown>, unknown>;
name: GField<...>;
})
fields
: {
id: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, unknown>, unknown>
id
:
const g: GWithContext<unknown>
g
.
field: <unknown, GNonNull<GScalarType<string, string>>, unknown, any>(field: FieldFuncArgs<unknown, any, GNonNull<GScalarType<string, string>>, unknown> & {
...;
}) => GField<...>
field
({
type: GNonNull<GScalarType<string, string>>
type
:
const g: GWithContext<unknown>
g
.
nonNull: <GScalarType<string, string>>(of: GScalarType<string, string>) => GNonNull<GScalarType<string, string>>
nonNull
(
const g: GWithContext<unknown>
g
.
type ID: GScalarType<string, string>
ID
) }),
name: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, unknown>, unknown>
name
:
const g: GWithContext<unknown>
g
.
field: <unknown, GNonNull<GScalarType<string, string>>, unknown, any>(field: FieldFuncArgs<unknown, any, GNonNull<GScalarType<string, string>>, unknown> & {
...;
}) => GField<...>
field
({
type: GNonNull<GScalarType<string, string>>
type
:
const g: GWithContext<unknown>
g
.
nonNull: <GScalarType<string, string>>(of: GScalarType<string, string>) => GNonNull<GScalarType<string, string>>
nonNull
(
const g: GWithContext<unknown>
g
.
type String: GScalarType<string, string>
String
) }),
},
});
type
type UserSource = {
entityType: "User";
id: string;
name: string;
}
UserSource
= {
entityType: "User"
entityType
: "User";
id: string
id
: string;
name: string
name
: string };
const
const User: GObjectType<UserSource, unknown>
User
=
const g: GWithContext<unknown>
g
.
object: <UserSource>(youOnlyNeedToPassATypeParameterToThisFunctionYouPassTheActualRuntimeArgsOnTheResultOfThisFunction?: {
youOnlyNeedToPassATypeParameterToThisFunctionYouPassTheActualRuntimeArgsOnTheResultOfThisFunction: true;
}) => <Fields, Interfaces>(config: {
...;
} & Omit<...>) => GObjectType<...>
object
<
type UserSource = {
entityType: "User";
id: string;
name: string;
}
UserSource
>()({
name: string
name
: "User",
interfaces?: [GInterfaceType<unknown, {
id: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, unknown>, unknown>;
name: GField<...>;
}, unknown>]
interfaces
: [
const Entity: GInterfaceType<unknown, {
id: GField<unknown, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, unknown>, unknown>;
name: GField<...>;
}, unknown>
Entity
],
fields: {
id: GField<UserSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, unknown>, unknown>;
name: GField<...>;
} | (() => {
id: GField<UserSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, unknown>, unknown>;
name: GField<...>;
})
fields
: {
id: GField<UserSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, unknown>, unknown>
id
:
const g: GWithContext<unknown>
g
.
field: <UserSource, GNonNull<GScalarType<string, string>>, unknown, any>(field: FieldFuncArgs<UserSource, any, GNonNull<GScalarType<string, string>>, unknown> & {
...;
}) => GField<...>
field
({
type: GNonNull<GScalarType<string, string>>
type
:
const g: GWithContext<unknown>
g
.
nonNull: <GScalarType<string, string>>(of: GScalarType<string, string>) => GNonNull<GScalarType<string, string>>
nonNull
(
const g: GWithContext<unknown>
g
.
type ID: GScalarType<string, string>
ID
) }),
name: GField<UserSource, any, GNonNull<GScalarType<string, string>>, ImpliedResolver<any, GNonNull<GScalarType<string, string>>, unknown>, unknown>
name
:
const g: GWithContext<unknown>
g
.
field: <UserSource, GNonNull<GScalarType<string, string>>, unknown, any>(field: FieldFuncArgs<UserSource, any, GNonNull<GScalarType<string, string>>, unknown> & {
...;
}) => GField<...>
field
({
type: GNonNull<GScalarType<string, string>>
type
:
const g: GWithContext<unknown>
g
.
nonNull: <GScalarType<string, string>>(of: GScalarType<string, string>) => GNonNull<GScalarType<string, string>>
nonNull
(
const g: GWithContext<unknown>
g
.
type String: GScalarType<string, string>
String
) }),
},
isTypeOf?: Maybe<GraphQLIsTypeOfFn<UserSource, unknown>>
isTypeOf
(
source: UserSource
source
) {
return
source: UserSource
source
.
entityType: "User"
entityType
=== "User";
},
});