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.