# qk-array-structure: Always Use Arrays for Query Keys

## Priority: CRITICAL

## Explanation

Query keys must always be arrays at the top level. This enables proper caching, invalidation matching, and query deduplication. Using non-array keys will cause unexpected behavior and cache misses.

## Bad Example

```tsx
// Never use strings or non-array types as query keys
const { data } = useQuery({
  queryKey: "todos", // Wrong: string instead of array
  queryFn: fetchTodos,
});

const { data: user } = useQuery({
  queryKey: { id: 1, type: "user" }, // Wrong: object instead of array
  queryFn: fetchUser,
});
```

## Good Example

```tsx
// Always use arrays for query keys
const { data } = useQuery({
  queryKey: ["todos"],
  queryFn: fetchTodos,
});

const { data: user } = useQuery({
  queryKey: ["user", 1],
  queryFn: () => fetchUser(1),
});

// Complex keys with objects inside arrays are fine
const { data: filteredTodos } = useQuery({
  queryKey: ["todos", { status: "done", page: 1 }],
  queryFn: () => fetchTodos({ status: "done", page: 1 }),
});
```

## Context

- Always applicable when defining query keys
- Arrays enable prefix-based invalidation (e.g., `invalidateQueries({ queryKey: ['todos'] })` matches all todo queries)
- Object property order inside arrays doesn't matter for matching
- Array element order does matter: `['todos', 1]` !== `['1', 'todos']`
