Skip to Content
Gqlts

Type helpers

Generated clients export request and result helper types. Use them when a request object or response type needs to live outside the client.query(...) call.

Reuse a request object

Use QueryRequest, MutationRequest, or SubscriptionRequest when you want TypeScript to validate a reusable request object.

import { createClient, type QueryRequest } from './generated'; const client = createClient(); const countriesRequest = { countries: { name: true, code: true, }, } satisfies QueryRequest; const result = await client.query(countriesRequest);

satisfies validates the request without widening it to every possible query field.

Reuse a response type

Use QueryResult, MutationResult, or SubscriptionResult when another function needs the selected response shape.

import { type QueryResult } from './generated'; function tuple<TArgs, TFields>(value: [TArgs, TFields]): [TArgs, TFields] { return value; } const countriesRequest = { countries: tuple([ { filter: { continent: { eq: 'EU' } } }, { name: true, code: true, }, ]), }; type CountriesResult = QueryResult<typeof countriesRequest>; function renderCountries(result: CountriesResult) { return result.countries.map((country) => country.name); }

Use a tuple helper for fields with arguments so TypeScript keeps tuple semantics.

Tuple helper

If your project prefers helpers over as const, define a small tuple helper:

function tuple<TArgs, TFields>(value: [TArgs, TFields]): [TArgs, TFields] { return value; } const request = { country: tuple([{ code: 'CA' }, { name: true, emoji: true }]), }; type CountryResult = QueryResult<typeof request>;

Do not annotate a request as QueryRequest when you need QueryResult<typeof request>. The explicit annotation widens the selected fields and TypeScript can no longer infer the exact response.