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: () => [] }), },});
interface Entity { id: ID! name: String!}
type User implements Entity { id: ID! name: String!}
type Organisation implements Entity { id: ID! name: String! members: [User]}
type Query { entity(id: ID!): Entity}
query { entity(id: "123") { id name ... on Organisation { members { id } } }}
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],});
type Query { search(query: String!): [SearchResult]}
union SearchResult = User | Post
type User { id: ID! name: String!}
type Post { id: ID! title: String!}
query { search(query: "graphql") { __typename ... on User { id name } ... on Post { id title } }}
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 toisTypeOf
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"; },});