Files
frontend-style-guide/OLD_parts/10-stores.md
2026-01-29 16:00:19 +03:00

5.0 KiB
Raw Permalink Blame History

title
title
Stores

Stores

Сторы (Stores)

В этом разделе собраны основные правила и рекомендации по созданию и оформлению сторов. Следуйте этим принципам, чтобы обеспечить чистую архитектуру, удобство поддержки и единый стиль работы с состоянием в проекте. В проекте для организации состояния используется только библиотека Zustand.

Структура

  • Store размещается в файле <store-name>.store.ts в папке stores/ на своём уровне абстракции согласно архитектуре проекта.
  • Интерфейс состояния описывается в этом же файле с суффиксом State (PascalCase).
  • Для каждого store создаётся отдельный хук доступа (например, useTodoStore).
  • Для глобальных сторов используйте только shared/store.

Именование

Требования

  • В store допускается только хранение состояния и методы управления им, без бизнес-логики, асинхронных операций и side-effects (см. раздел "Правила организации и использовалья Store").
  • Для методов, изменяющих состояние через set, если используется функция — тело функции в фигурных скобках, return с новой строки после стрелки.
  • Не дублируйте логику между сторами.

Типизация

  • Всегда указывайте типы для всех полей состояния и методов.
  • Не используйте неявное приведение типов и не полагайтесь на автоматический вывод, если это может снизить читаемость или безопасность.

Документирование

Экспорт

  • Экспортируйте хук доступа к 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 и смысл полей (см. правила документирования кода).
  • Нет неиспользуемого или невалидного кода.
  • Экспорт через индексный файл.