| .. | ||
| diff.sh | ||
| README.md | ||
| typecheck.snapshot.txt | ||
Известный техдолг по линтеру
Эта папка фиксирует известное состояние npm run typecheck в репозитории. Build при этом зелёный, prod задеплоен — это исторический технический долг, не блокер. Папка нужна чтобы при любых изменениях кода сравнивать delta (только то что мы добавили), не путаясь в предсуществующих ошибках.
После апгрейда TypeScript 4.9 → 5.4 + moduleResolution: "Bundler" (см. историю коммита) основная масса (~803 из 835 предыдущих ошибок) исчезла. Осталось ~32 ошибки уже про реальные баги/несоответствия типов в нашем коде, не про модульное резолвинг. npm run check:eslint теперь — обычный зелёный чек (0 ошибок, 116 warnings), отдельный snapshot не нужен.
Состав
| Файл | Что |
|---|---|
typecheck.snapshot.txt |
Полный stdout npm run typecheck. ~61 строка, ~32 ошибки. |
diff.sh |
Скрипт сравнения: запускает текущий typecheck, сравнивает с snapshot-ом, выдаёт только delta. |
Как пользоваться
bash docs/known-tech-debt-lint/diff.sh
На чистой ветке выводит:
=== typecheck diff vs known-tech-debt snapshot ===
no new typecheck errors
Если что-то сломал — выводит конкретные новые ошибки в формате file.tsx(_,_): error TS... (line/col маска чтобы pure-line-shift не давал phantom NEW + fixed). Реальные позиции — npm run typecheck напрямую. Если случайно починил предсуществующий долг — отчитается «(incidentally fixed: N)» к сведению.
Скрипт смотрит working tree, не staged-состояние. Для строгого pre-commit gate сначала apply'нуть свой stage в чистый worktree (git stash --keep-index + bash diff.sh + git stash pop).
npm run check:eslint запускайте напрямую — он зелёный.
Что в долге (TL;DR)
Typecheck (~32 ошибок): реальные несоответствия типов. Категории:
- TS2345 keyof literal-union mismatch (~14):
mx.getAccountData(string)/mx.getStateEvent(...)ждётkeyof AccountDataEvents(узкие литеральные типы), у нас передаютсяAccountDataEvent.PoniesEmoteRooms,'m.call.member','in.cinny.spaces'и т.п. — валидные Matrix event-types, но не в SDK-юнионе. - TS2345 i18next signature (~3):
t('Room.members_count', { count: millify(...) })—countхочетnumber, аmillify()возвращаетstring. На рантайме отображается корректно (в локалях нет plural-вариантов). - TS2345 / TS18048
Room | undefined/Room | nullпосле.filter((r) => !!r)(~6): TS не пропускает truthy-фильтр без type predicate. UserChips.tsx, AddExisting.tsx, Invites.tsx, GlobalPacks.tsx. Runtime безопасно. - TS2345
IContent→RoomMessageEventContent(1): MessageEditor.tsx — typing gap между общим content и room-message variant. - TS7006 implicit
any(6): event-handler params (evt,event,ev) в Message.tsx, EventReaders.tsx, UrlPreviewCard.tsx, LiveChip.tsx, MemberGlance.tsx, ReactionViewer.tsx. - TS2540 read-only
sandbox(1): CallEmbed.ts —iframe.sandbox = "...". Современные DOM types сделали егоDOMTokenListread-only, но браузеры всё ещё принимают строку. - TS2353 unknown property
endpoint(1): push.ts — лишнее поле вsetPusher.data. SDK типы неполные, sygnal/UnifiedPush его читает. - TS2322
(number | undefined)[]→number[](1): usePowerLevelTags.ts — то же truthy-filter narrowing.
Build зелёный, ESLint зелёный. Все 32 оставшихся ошибки — type-strictness без runtime-импакта (truthy-filter narrowing, узкие SDK literal-union'ы, под-типированные event-handler params, слишком строгий DOM types). Это известный долг, не блокер. Будущая чистка — отдельный план (создать docs/plans/typecheck_residual_cleanup.md когда возьмёмся).
Когда обновлять snapshot
Когда долг будет частично разруливаться отдельной задачей — после её мерджа пересоздать snapshot:
npm run typecheck > docs/known-tech-debt-lint/typecheck.snapshot.txt 2>&1
И обновить TL;DR в этом README.
Когда typecheck станет зелёным — удалить эту папку целиком и включить husky pre-commit hook.