--- title: Stores --- # Stores ## Сторы (Stores) > В этом разделе собраны основные правила и рекомендации по созданию и оформлению сторов. Следуйте этим принципам, чтобы обеспечить чистую архитектуру, удобство поддержки и единый стиль работы с состоянием в проекте. > В проекте для организации состояния используется только библиотека Zustand. ### Структура - Store размещается в файле `.store.ts` в папке `stores/` на своём уровне абстракции согласно архитектуре проекта. - Интерфейс состояния описывается в этом же файле с суффиксом `State` (PascalCase). - Для каждого store создаётся отдельный хук доступа (например, `useTodoStore`). - Для глобальных сторов используйте только `shared/store`. ### Именование - Соблюдайте [правила именования файлов и папок](#правила-именования-файлов-и-папок): - Файл store — `.store.ts` (kebab-case). - Имя интерфейса состояния — PascalCase с суффиксом `State`. - Имя хука — camelCase с префиксом `use`. ### Требования - В store допускается только хранение состояния и методы управления им, без бизнес-логики, асинхронных операций и side-effects (см. раздел "Правила организации и использовалья Store"). - Для методов, изменяющих состояние через set, если используется функция — тело функции в фигурных скобках, return с новой строки после стрелки. - Не дублируйте логику между сторами. ### Типизация - Всегда указывайте типы для всех полей состояния и методов. - Не используйте неявное приведение типов и не полагайтесь на автоматический вывод, если это может снизить читаемость или безопасность. ### Документирование - Документируйте только назначение store и смысл полей, строго по [правилам документирования кода](#правило-для-документирования-кода). ### Экспорт - Экспортируйте хук доступа к store и интерфейс состояния через `index.ts` слоя/компонента. ### Примеры ```ts import { create } from 'zustand'; import { TodoItem } from './types/todo-item.interface'; /** * Состояние хранилища задач. */ export interface TodoStoreState { /** Массив задач. */ items: TodoItem[]; /** Добавить задачу. */ addTodo: (item: TodoItem) => void; /** Удалить задачу. */ removeTodo: (id: string) => void; } /** * Хук для доступа к хранилищу задач. */ export const useTodoStore = create((set) => ({ items: [], addTodo: (item) => set((state) => { return { items: [...state.items, item], }; }), removeTodo: (id) => set((state) => { return { items: state.items.filter((t) => t.id !== id), }; }), })); ``` ### Чек-лист - [ ] Store размещён в `stores/.store.ts` на своём уровне абстракции согласно архитектуре проекта. - [ ] Именование файлов и сущностей соответствует [правилам именования файлов и папок](#правила-именования-файлов-и-папок). - [ ] Все поля и методы строго типизированы (см. [общие правила типизации](#общие-правила-типизации)). - [ ] В store только состояние и методы управления им, без бизнес-логики и side-effects. - [ ] Для методов, изменяющих состояние через set, используется функция с return с новой строки. - [ ] Документировано только назначение store и смысл полей (см. [правила документирования кода](#правило-для-документирования-кода)). - [ ] Нет неиспользуемого или невалидного кода. - [ ] Экспорт через индексный файл.