Не дублируй типы. Опиши один канонический тип и выводи из него DTO, Patch, Props через Partial, Pick, Omit, Record.
Renderless-компонент = логика без UI: template только со slot, состояние и методы уходят родителю через scoped slot props. Данные → composable, поведение вокруг разного UI → renderless.
UI → Feature → Domain ← Data. Каждый слой зависит только от нижнего. Domain — чистый TS без Vue.
Container управляет состоянием, Presentation рендерит. Props вниз (данные), emit вверх (события). Имена пропсов = имена emit-событий с on-префиксом.
Композабл = JSDoc + типизированный возврат + readonly на state. Ошибки — через throw, не ref(error).
Generic = тип-параметр <T>, который сохраняет конкретный тип сквозь функцию. Выводится автоматически, ограничивается extends.
Feature-based — файлы рядом с фичей. Layer-based — файлы по типу (components/, stores/). В малых проектах — feature-based.
interface — для объектов, type — для unions/intersections. Narrowing через type guards и in-оператор.