T9: Type safety pass
T9: Type safety pass
Section titled “T9: Type safety pass”Phase: BCG Phase 1 Depends on: T8 (CSS унифицирован) Effort: ~1.5h
Context
Section titled “Context”Финальная фаза — закрыть type-safety дыры после всех рефакторингов.
Читать:
archive/2026-04-23-bcg-planning-docs/BCG_plan.md§1.6.1-1.6.2
- String-matching заменить на enum-типы
- Убрать
as-assertions npx tsc --noEmit— 0 ошибок (должно быть уже)
1. Toast type — явный enum
Section titled “1. Toast type — явный enum”src/components/ToastSystem.tsx (или где живёт resolveStatusToastType):
- Было: функция, которая ищет подстроку в сообщении и возвращает
"error" | "warning" | "success" | "info" - Стало: вызывающий код явно передаёт
ToastType
Тип уже должен быть:
export type ToastType = "success" | "error" | "warning" | "info";Обновить все места вызова (analysisStore.showStatus, showError и т.д.) — пусть принимают type: ToastType параметром.
Удалить функцию resolveStatusToastType если она больше не нужна.
2. draftStorageWarning — явный enum
Section titled “2. draftStorageWarning — явный enum”В draftStore сейчас warning определяется через startsWith("Storage full"). Заменить:
export type StorageWarningLevel = "full" | "nearFull" | "cleared" | null;
interface DraftState { draftStorageWarning: StorageWarningLevel; draftStorageMessage: string | null; // human-readable, если нужно показать}UI-компоненты проверяют level, не строку.
3. Убрать as assertions
Section titled “3. Убрать as assertions”rg " as " src --type ts --type tsx -nДля каждого найти:
- Если это narrowing типа — заменить на type guard или
satisfies - Если это фикстура тестовая — использовать
satisfies - Если это
as const— оставить (это OK) - Если есть
sampleProject as Parameters<typeof hydrateLoadedPayload>[0]— типизироватьsample-project.jsonчерезsatisfies ExperimentDraftв импорте
Оставить только осознанные случаи, где as действительно необходим (например, as unknown as X для тестовых моков). Их заком ментировать одной строкой: // as needed because X.
4. strict mode проверка
Section titled “4. strict mode проверка”В tsconfig.json: "strict": true должен быть включён (ожидается, что уже). Проверить:
grep '"strict"' tsconfig.jsonЕсли не true — включить. Если появились ошибки — исправить.
5. Verify
Section titled “5. Verify”cd app/frontendnpx tsc --noEmit # 0 ошибокrg " as " src --type ts --type tsx -n | wc -l # сократилосьnpx vitest runnpm run buildDone When
Section titled “Done When”-
ToastTypeиспользуется явно,resolveStatusToastTypeудалён (или сильно упрощён) -
StorageWarningLevelenum-тип используется вместо string-matching - Количество
asвsrc/*.ts, *.tsxзаметно сократилось (осознанные случаи прокомментированы) -
npx tsc --noEmit— 0 ошибок -
strict: trueв tsconfig - Все тесты зелёные
Constraints
Section titled “Constraints”- Не менять публичные API сторов — только внутренние типы
- Не менять сигнатуры API endpoints (бэкенд не трогаем)