Default Field Resolution

Not every field needs an explicit resolver.

Suppose a resolver returns:

{
  id: "42",
  name: "Alice",
  email: "alice@example.com"
}

and the schema contains:

type User {
  id: ID!
  name: String!
  email: String!
}

GraphQL implementations commonly provide default field resolution behavior that reads matching properties from the parent object.

Conceptually:

User object
   |
   +-- id    → User.id
   +-- name  → User.name
   +-- email → User.email

Therefore, you often only need to explicitly define a resolver for fields requiring special behavior.

For example, if name is already a property on the returned object, an explicit resolver may be unnecessary.

But if the schema field is:

fullName: String!

while the underlying object contains:

{
  firstName: "Alice",
  lastName: "Johnson"
}

you may need a custom resolver:

const resolvers = {
  User: {
    fullName: (user) => `${user.firstName} ${user.lastName}`
  }
};

This default-resolution behavior helps keep resolver maps concise.

Custom Computed Field
const resolvers = {
  User: {
    fullName: (user) => `${user.firstName} ${user.lastName}`
  }
};
💡 The underlying object does not contain a fullName property, so a custom resolver computes it from firstName and lastName. Fields whose names already correspond to parent object properties can often use default resolution.
Key Takeaways
  • GraphQL servers commonly provide default field resolution.
  • Explicit resolvers are useful for computed or transformed fields.
  • Returning an object with matching properties can reduce resolver boilerplate.
Knowledge Check

When can a GraphQL field often use default resolution instead of a custom resolver?