Skip to content

[typescript-resolvers] Excess properties allowed in resolver return types #3

@productdevbook

Description

@productdevbook

Problem

TypeScript resolvers don't catch excess properties, allowing invalid data to pass type checking:

// This compiles without errors ❌
const resolvers: Resolvers = {
  Query: {
    user: () => ({
      id: '1',
      name: 'John',
      email: 'john@example.com',
      invalidField: 'should error but doesnt' // No TypeScript error
    })
  }
}

Root Cause

Current ResolverFn uses structural typing:

export type ResolverFn<TResult, ...> = (...) => Promise<TResult> | TResult;

TResult allows excess properties due to TypeScript's structural typing.

Proposed Solution

Add strictResolverReturnTypes config option:

# codegen.yml
config:
  strictResolverReturnTypes: true

Generate exact types:

type Exact<T> = { [K in keyof T]: T[K] } & Record<string, never>;
export type ResolverFn<TResult, ...> = (...) => Promise<Exact<TResult>> | Exact<TResult>;

Expected Result

const resolvers: Resolvers = {
  Query: {
    user: () => ({
      id: '1',
      name: 'John', 
      email: 'john@example.com',
      invalidField: 'now errors' // ✅ TypeScript error
    })
  }
}

Backward compatible, opt-in feature for better type safety.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workinghelp wantedExtra attention is needed

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions