5.0 KiB
5.0 KiB
title
| title |
|---|
| Stores |
Stores
Сторы (Stores)
В этом разделе собраны основные правила и рекомендации по созданию и оформлению сторов. Следуйте этим принципам, чтобы обеспечить чистую архитектуру, удобство поддержки и единый стиль работы с состоянием в проекте. В проекте для организации состояния используется только библиотека Zustand.
Структура
- Store размещается в файле
<store-name>.store.tsв папкеstores/на своём уровне абстракции согласно архитектуре проекта. - Интерфейс состояния описывается в этом же файле с суффиксом
State(PascalCase). - Для каждого store создаётся отдельный хук доступа (например,
useTodoStore). - Для глобальных сторов используйте только
shared/store.
Именование
- Соблюдайте правила именования файлов и папок:
- Файл store —
<store-name>.store.ts(kebab-case). - Имя интерфейса состояния — PascalCase с суффиксом
State. - Имя хука — camelCase с префиксом
use.
Требования
- В store допускается только хранение состояния и методы управления им, без бизнес-логики, асинхронных операций и side-effects (см. раздел "Правила организации и использовалья Store").
- Для методов, изменяющих состояние через set, если используется функция — тело функции в фигурных скобках, return с новой строки после стрелки.
- Не дублируйте логику между сторами.
Типизация
- Всегда указывайте типы для всех полей состояния и методов.
- Не используйте неявное приведение типов и не полагайтесь на автоматический вывод, если это может снизить читаемость или безопасность.
Документирование
- Документируйте только назначение store и смысл полей, строго по правилам документирования кода.
Экспорт
- Экспортируйте хук доступа к store и интерфейс состояния через
index.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<TodoStoreState>((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-name>.store.tsна своём уровне абстракции согласно архитектуре проекта. - Именование файлов и сущностей соответствует правилам именования файлов и папок.
- Все поля и методы строго типизированы (см. общие правила типизации).
- В store только состояние и методы управления им, без бизнес-логики и side-effects.
- Для методов, изменяющих состояние через set, используется функция с return с новой строки.
- Документировано только назначение store и смысл полей (см. правила документирования кода).
- Нет неиспользуемого или невалидного кода.
- Экспорт через индексный файл.