Abstract type resolution helps GraphQL know which specific type to use when a query asks for a general type. It makes sure you get the right data shape.
Abstract type resolution in GraphQL
Start learning this pattern below
Jump into concepts and practice - no test required
interface Animal {
id: ID!
name: String!
}
type Dog implements Animal {
id: ID!
name: String!
barkVolume: Int
}
type Cat implements Animal {
id: ID!
name: String!
livesLeft: Int
}
union Pet = Dog | Cat
# Resolver example for interface or union
const resolvers = {
Animal: {
__resolveType(obj) {
if (obj.barkVolume !== undefined) {
return 'Dog';
}
if (obj.livesLeft !== undefined) {
return 'Cat';
}
return null; // GraphQL will error if null
}
},
Pet: {
__resolveType(obj) {
if (obj.barkVolume !== undefined) {
return 'Dog';
}
if (obj.livesLeft !== undefined) {
return 'Cat';
}
return null; // GraphQL will error if null
}
}
};The __resolveType function tells GraphQL which concrete type to use.
This is needed for interfaces and unions because they can represent multiple types.
interface Vehicle {
id: ID!
make: String!
}
type Car implements Vehicle {
id: ID!
make: String!
doors: Int
}
type Bike implements Vehicle {
id: ID!
make: String!
hasPedals: Boolean
}
const resolvers = {
Vehicle: {
__resolveType(obj) {
if (obj.doors !== undefined) {
return 'Car';
}
if (obj.hasPedals !== undefined) {
return 'Bike';
}
return null; // GraphQL will error if null
}
}
};union SearchResult = Photo | Person const resolvers = { SearchResult: { __resolveType(obj) { if (obj.url) { return 'Photo'; } if (obj.name) { return 'Person'; } return null; // GraphQL will error if null } } };
This program sets up a GraphQL server with an Animal interface. It returns a list of animals that can be Dogs or Cats. The __resolveType function tells GraphQL which type each animal is.
const { ApolloServer, gql } = require('apollo-server'); const typeDefs = gql` interface Animal { id: ID! name: String! } type Dog implements Animal { id: ID! name: String! barkVolume: Int } type Cat implements Animal { id: ID! name: String! livesLeft: Int } type Query { animals: [Animal] } `; const animalsData = [ { id: '1', name: 'Rex', barkVolume: 5 }, { id: '2', name: 'Whiskers', livesLeft: 7 } ]; const resolvers = { Query: { animals: () => animalsData }, Animal: { __resolveType(obj) { if (obj.barkVolume !== undefined) { return 'Dog'; } if (obj.livesLeft !== undefined) { return 'Cat'; } return null; // GraphQL will error if null } } }; const server = new ApolloServer({ typeDefs, resolvers }); server.listen().then(({ url }) => { console.log(`Server ready at ${url}`); });
The __resolveType function runs every time GraphQL needs to know the exact type.
If you forget to implement __resolveType, GraphQL will give an error when querying interfaces or unions.
Use abstract type resolution to keep your schema flexible and clean when dealing with multiple related types.
Abstract type resolution helps GraphQL pick the right type when you use interfaces or unions.
You write a __resolveType function that checks your data and returns the correct type name.
This makes your queries return the right fields for each specific type.
Practice
__resolveType function in GraphQL when using interfaces or unions?Solution
Step 1: Understand abstract types in GraphQL
Abstract types like interfaces or unions can represent multiple object types.Step 2: Role of
This function tells GraphQL which concrete type to use for the returned data.__resolveTypeFinal Answer:
To determine the specific object type to return for an abstract type -> Option DQuick Check:
Abstract type resolution = determine specific type [OK]
__resolveType picks the exact type [OK]- Confusing
__resolveTypewith data fetching - Thinking it validates query syntax
- Assuming it defines scalar types
__resolveType function in a GraphQL resolver object?Solution
Step 1: Check the naming and return value
The function must be named exactly__resolveTypeand return a string matching a type name.Step 2: Match the returned value to the data field
Commonly, the field__typenameholds the type name, so returningobj.__typenameis correct.Final Answer:
__resolveType(obj) { return obj.__typename; } -> Option CQuick Check:
Correct function name and return field = __resolveType(obj) { return obj.__typename; } [OK]
__resolveType [OK]- Using wrong function name like resolveType
- Returning incorrect property like type
- Returning undefined or wrong field
__resolveType(obj) {
if (obj.price) return 'Book';
if (obj.author) return 'Author';
return null;
}What will be the resolved type for
{ price: 20, author: 'John' }?Solution
Step 1: Check conditions in order
The function first checks ifobj.priceexists, which is true here.Step 2: Return first matching type
Sinceobj.priceis true, it returns 'Book' immediately without checking further.Final Answer:
Book -> Option AQuick Check:
First true condition returns 'Book' [OK]
- Assuming it returns 'Author' because author field exists
- Thinking it returns null if multiple fields exist
- Expecting an error for multiple matches
__resolveType function:__resolveType(obj) {
if (obj.kind === 'User') return 'User';
if (obj.kind === 'Admin') return 'Admin';
}But your GraphQL query returns
null for the type. What is the likely problem?Solution
Step 1: Check function completeness
The function lacks a return for cases whenobj.kindis neither 'User' nor 'Admin'.Step 2: Understand GraphQL behavior
If no type is returned, GraphQL resolves the type asnull, causing query issues.Final Answer:
Missing a return statement for unmatched cases -> Option BQuick Check:
Always return a type or null explicitly [OK]
__resolveType [OK]- Using wrong function name without underscores
- Assuming missing return defaults to a type
- Believing GraphQL doesn't support
__resolveType
Vehicle implemented by types Car and Bike. Your __resolveType function is:__resolveType(obj) {
return obj.wheels === 4 ? 'Car' : 'Bike';
}If an object has
{ wheels: 0 }, what will happen when querying this interface?Solution
Step 1: Evaluate the ternary condition
The condition checks ifobj.wheels === 4. For 0, this is false.Step 2: Determine returned type
Since condition is false, it returns 'Bike'.Final Answer:
It will resolve to 'Bike' because wheels is not 4 -> Option AQuick Check:
Condition false returns 'Bike' [OK]
__resolveType [OK]- Confusing falsy 0 with true condition
- Expecting runtime error for zero wheels
- Assuming null return causes failure
