Skip to content

Defining Parameter Interfaces

You can define interfaces for your parameters:

typescript
interface UserParams {
  id: string;
  includePosts?: boolean;
}

interface PostParams {
  id: string;
  includeComments?: boolean;
}

const queryKeys = createKeyFactory('app', {
  users: {
    detail: (params: UserParams) => [
      params.id,
      ...(params.includePosts ? ['posts'] : []),
    ],
  },
  posts: {
    detail: (params: PostParams) => [
      params.id,
      ...(params.includeComments ? ['comments'] : []),
    ],
  },
});

Reusing Types

You can reuse types across multiple keys:

typescript
interface IDParams {
  id: string;
}

const queryKeys = createKeyFactory('app', {
  users: {
    detail: (params: IDParams) => [params.id],
  },
  posts: {
    detail: (params: IDParams) => [params.id],
  },
  comments: {
    detail: (params: IDParams) => [params.id],
  },
});

Complex Types

Use complex types for advanced scenarios:

typescript
interface SearchParams {
  query: string;
  filters?: {
    category?: string;
    priceRange?: [number, number];
  };
  pagination?: {
    page: number;
    limit: number;
  };
}

const queryKeys = createKeyFactory('shop', {
  products: {
    search: (params: SearchParams) => [
      params.query,
      ...(params.filters?.category ? [params.filters.category] : []),
      ...(params.pagination ? [`page-${params.pagination.page}`] : []),
    ],
  },
});

Released under the MIT License.